<?php
return [
    // General
    'app_name'          => 'Plenvo',
    'save'              => 'Save',
    'cancel'            => 'Cancel',
    'delete'            => 'Delete',
    'edit'              => 'Edit',
    'create'            => 'Create',
    'created_at_label'  => 'Created',
    'updated_at_label'  => 'Updated',
    'back'              => 'Back',
    'search'            => 'Search',
    'filter'            => 'Filter',
    'actions'           => 'Actions',
    'yes'               => 'Yes',
    'no'                => 'No',
    'confirm_delete'    => 'Really delete?',
    'loading'           => 'Loading...',
    'error'             => 'Error',
    'success'           => 'Success',
    'warning'           => 'Warning',
    'required_field'    => 'Required',
    'optional'          => 'Optional',
    'none'              => 'None',
    'all'               => 'All',
    'close'             => 'Close',
    'add'               => 'Add',
    'remove'            => 'Remove',
    'settings'          => 'Settings',
    'hello'             => 'Hello',
    'just_now'          => 'Just now',
    'minutes_ago'       => 'minutes ago',
    'hours_ago'         => 'hours ago',
    'days_ago'          => 'days ago',
    'view_task'         => 'View task',
    'access_denied'     => 'Access denied',
    'not_found'         => 'Not found',
    'no_results'        => 'No results',

    // Auth
    'login'             => 'Sign in',
    'register'          => 'Register',
    'logout'            => 'Sign out',
    'email'             => 'E-Mail',
    'password'          => 'Password',
    'password_confirm'  => 'Confirm password',
    'login_title'       => 'Welcome back',
    'login_subtitle'    => 'Sign in to your account',
    'login_error'       => 'Invalid email or password',
    'login_rate_limited'=> 'Too many login attempts. Please wait 15 minutes.',
    'login_account_locked' => 'This account is temporarily locked after multiple failed login attempts. Please try again later or reset your password.',
    'session_expired'   => 'Your session has expired. Please sign in again.',
    'password_pwned'    => 'This password appears in known data breaches. Please choose a different one.',

    // Security settings (BSI APP.3.1)
    'security_settings'         => 'Security policies',
    'sec_lockout_title'         => 'Account lockout after failed logins',
    'sec_lockout_desc'          => 'Locks the account after several wrong passwords. Accounts with active two-factor authentication are exempt.',
    'sec_lockout_enable'        => 'Enable account lockout',
    'sec_lockout_threshold'     => 'Failed attempts before lockout',
    'sec_lockout_threshold_hint'=> 'Recommended: 5 (BSI ORP.4.A8).',
    'sec_lockout_duration'      => 'Lockout duration (minutes)',
    'sec_lockout_duration_hint' => 'How long the account stays locked once the threshold is reached.',
    'sec_session_title'         => 'Session timeouts',
    'sec_session_desc'          => 'Automatically ends sessions to protect hijacked browsers (BSI APP.3.1.A15). 0 = disabled.',
    'sec_session_idle'          => 'Idle timeout (minutes)',
    'sec_session_idle_hint'     => 'Default: 30. Session ends after this time without activity.',
    'sec_session_absolute'      => 'Maximum session lifetime (hours)',
    'sec_session_absolute_hint' => 'Default: 8. Forces re-authentication after this total time.',
    'sec_pwned_title'           => 'Block already-leaked passwords at set time',
    'sec_pwned_enable'          => 'Check passwords against the HIBP breach database when they are set or changed',
    'sec_pwned_hint'            => 'Only prevents a password that appears in a publicly known data breach from being newly assigned (registration, password change, reset, admin create). Existing passwords are NOT re-checked retroactively — HIBP works on plaintext, the DB only stores a bcrypt hash. Only a 5-character SHA-1 prefix is transmitted, never the password itself (k-anonymity).',
    'login_btn'         => 'Sign in',
    'remember_me'       => 'Keep me signed in',

    // Install
    'install_title'     => 'Installation',
    'install_subtitle'  => 'Create your administrator account',
    'install_btn'       => 'Complete installation',
    'install_success'   => 'Installation successful',

    // System requirements check
    'sys_requirements'          => 'System Requirements',
    'sys_req_all_ok'            => 'All requirements met',
    'sys_req_optional_missing'  => 'Optional features missing',
    'sys_req_critical_missing'  => 'Critical requirements missing',
    'sys_req_optional'          => 'optional',
    'sys_req_write_permission'  => 'Write permission on project directory',
    'sys_req_curl_detail'       => 'AI assistant & update checks',
    'sys_req_ldap_detail'       => 'LDAP / AD authentication plugin',
    'sys_req_zip_detail'        => 'One-click updates',

    // Health check (admin settings)
    'health_check'           => 'Health Check',
    'hc_refresh'             => 'Refresh',
    'hc_loading'             => 'Running checks…',
    'hc_cron'                => 'Cron Job',
    'hc_cron_never'          => 'Never ran – is the cron job configured?',
    'hc_cron_ok'             => 'Ran :min min ago',
    'hc_cron_late'           => ':min min ago – may not be running every minute',
    'hc_cron_stale'          => ':h hours ago – cron job appears to be stopped',
    'hc_probe_db'            => 'Database file not publicly accessible',
    'hc_probe_uploads'       => 'Upload directory not publicly accessible',
    'hc_probe_exposed'       => 'PUBLICLY ACCESSIBLE – check .htaccess immediately!',
    'hc_probe_blocked'       => 'Blocked (HTTP :code)',
    'hc_probe_no_conn'       => 'No connection – is the App URL configured?',
    'hc_probe_unexpected'    => 'Unexpected HTTP status: :code',
    'hc_no_app_url'          => 'App URL not configured',
    'hc_htaccess_data'       => '.htaccess present in data/',
    'hc_htaccess_uploads'    => '.htaccess present in uploads/',
    'hc_file_present'        => 'File present',
    'hc_file_missing'        => 'File missing – create .htaccess or re-run the install wizard',
    'admin_username'    => 'First & last name',
    'admin_email'       => 'Admin E-Mail',
    'admin_password'    => 'Admin Password',

    // Navigation
    'dashboard'         => 'Dashboard',
    'projects'          => 'Projects',
    'my_tasks'          => 'My Tasks',
    'notifications'     => 'Notifications',
    'admin'             => 'Admin',
    'profile'           => 'Profile',
    'preferences'       => 'Preferences',
    'plugins'           => 'Plugins',
    'help'              => 'Help',

    // Dashboard
    'welcome_back'      => 'Welcome back',
    'active_projects'   => 'Active Projects',
    'open_tasks'        => 'Open Tasks',
    'done_tasks'        => 'Completed Tasks',
    'all_tasks'         => 'All Tasks',
    'my_tasks_empty'    => 'No tasks are assigned to you.',
    'reset'             => 'Reset',
    'today'             => 'Today',
    'due_today'         => 'Due Today',
    'overdue'           => 'Overdue',
    'recent_activity'   => 'Recent Activity',
    'my_open_tasks'     => 'My Open Tasks',
    'no_tasks'          => 'No tasks',
    'no_activity'       => 'No activity yet',

    // Projects
    'project'           => 'Project',
    'new_project'       => 'New Project',
    'project_name'      => 'Project Name',
    'project_desc'      => 'Description',
    'project_color'     => 'Color',
    'project_status'    => 'Status',
    'project_owner'     => 'Owner',
    'project_members'   => 'Members',
    'project_settings'  => 'Project Settings',
    'default_view'      => 'Default View',
    'required_fields'   => 'Required fields for tasks',
    'no_projects'       => 'No projects yet',
    'create_first'      => 'Create your first project',
    'archived'          => 'Archived',
    'active'            => 'Active',
    'archive_project'   => 'Archive project',
    'archive_project_desc' => 'The project will be hidden for all members.',
    'delete_project_desc'  => 'This action is irreversible. All tasks will be deleted.',
    'delete_project_confirm' => 'Really delete project? This action cannot be undone!',
    'restore_project'   => 'Restore',
    'delete_project'    => 'Delete project',
    'project_created'   => 'Project created',
    'project_updated'   => 'Project updated',
    'project_deleted'   => 'Project deleted',

    // Views
    'kanban'            => 'Kanban',
    'list'              => 'List',
    'gantt'             => 'Gantt',
    'add_status'        => 'Add status',
    'status_name'       => 'Status Name',
    'mark_as_done'      => 'Mark as done',

    // Tasks
    'task'              => 'Task',
    'tasks'             => 'Tasks',
    'new_task'          => 'New Task',
    'task_title'        => 'Title',
    'task_desc'         => 'Description',
    'description'       => 'Description',
    'task_status'       => 'Status',
    'task_priority'     => 'Priority',
    'assigned_to'       => 'Assigned to',
    'external_short'           => 'Ext.',
    'external_name_placeholder'=> 'Enter name...',
    'created_by'        => 'Created by',
    'due_date'          => 'Due date',
    'start_date'        => 'Start date',
    'labels'            => 'Labels',
    'attachments'       => 'Attachments',
    'upload_file'       => 'Upload file',
    'predecessors'      => 'Predecessors',
    'successors'        => 'Successors',
    'no_predecessors'   => 'No predecessor',
    'no_successors'     => 'No successor',
    'predecessors_hint' => 'Multi-select with Ctrl/Cmd + click',
    'task_created'      => 'Task created',
    'task_updated'      => 'Task updated',
    'task_deleted'      => 'Task deleted',
    'file_uploaded'     => 'File uploaded',
    'no_tasks_here'     => 'No tasks in this status',
    'drag_here'         => 'Drag here',

    // Priority
    'priority'          => 'Priority',
    'priority_low'      => 'Low',
    'priority_medium'   => 'Medium',
    'priority_high'     => 'High',
    'priority_urgent'   => 'Urgent',

    // Comments
    'comments'          => 'Comments',
    'add_comment'       => 'Add comment',
    'comment_placeholder' => 'Write a comment...',
    'no_comments'       => 'No comments yet',
    'comment_posted'    => 'Comment posted',
    'edited'            => 'edited',

    // Members
    'members'           => 'Members',
    'add_member'        => 'Add member',
    'member_role'       => 'Role',
    'role_owner'        => 'Owner',
    'role_manager'      => 'Manager',
    'role_member'       => 'Member',
    'role_guest'        => 'Guest',
    'all_users_are_members' => 'All users are already members of this project.',
    'member_added'      => 'Member added',
    'member_removed'    => 'Member removed',
    'member_updated'    => 'Member updated',
    'last_owner_error'  => 'The project must have at least one owner.',
    'select_user'       => 'Select user',

    // Admin
    'users'             => 'Users',
    'new_user'          => 'New User',
    'username'          => 'First & last name',
    'user_role'         => 'System Role',
    'role_admin'        => 'Administrator',
    'role_user'         => 'User',
    'user_active'       => 'Active',
    'user_inactive'     => 'Inactive',
    'user_created'      => 'User created',
    'user_updated'      => 'User updated',
    'user_deleted'      => 'User deleted',
    'remove_from_group'         => 'Remove from group',
    'user_removed_from_group'   => 'User removed from group',
    'confirm_remove_from_group' => 'Really remove this user from the group?',
    'last_login'        => 'Last login',
    'never'             => 'Never',
    'system_settings'   => 'System Settings',
    'nav_support'       => 'Support',

    // Groups / Multi-tenancy
    'groups'                => 'Groups',
    'group'                 => 'Group',
    'new_group'             => 'New Group',
    'group_name'            => 'Group Name',
    'group_description'     => 'Description',
    'group_admin'           => 'Group Admin',
    'group_member'          => 'Member',
    'no_group'              => 'No Group',
    'group_created'         => 'Group created',
    'group_updated'         => 'Group updated',
    'group_deleted'         => 'Group deleted',
    'group_management'      => 'Group Management',
    'group_members'         => 'Group Members',
    'group_role'            => 'Group Role',
    'assign_group'          => 'Assign Group',
    'unassigned'            => 'Unassigned',
    'no_groups'             => 'No groups yet',
    'no_group_members'      => 'No members in this group',
    'language'          => 'Language',
    'theme'             => 'Theme',
    'theme_light'       => 'Default',
    'theme_dark'        => 'Dark',
    'theme_sepia'       => 'Sepia',
    'theme_midnight'    => 'Midnight',
    'theme_ocean'       => 'Ocean',
    'theme_matrix'      => 'Matrix',
    'theme_bluescreen'  => 'Bluescreen',
    'theme_forest'      => 'Forest',
    'theme_crimson'     => 'Crimson',
    'theme_slate'       => 'Slate',

    // SMTP
    'smtp_settings'     => 'SMTP Settings',
    'smtp_host'         => 'SMTP Server',
    'smtp_port'         => 'Port',
    'smtp_username'     => 'Username',
    'smtp_password'     => 'Password',
    'smtp_encryption'   => 'Encryption',
    'smtp_from_email'   => 'From Email',
    'smtp_from_name'    => 'From Name',
    'smtp_test'         => 'Test connection',
    'smtp_test_ok'      => 'SMTP connection successful',
    'smtp_test_fail'    => 'SMTP connection failed',
    'smtp_none'         => 'None',
    'smtp_ssl'          => 'SSL (Port 465)',
    'smtp_tls'          => 'TLS/STARTTLS (Port 587)',
    'notifications_enabled' => 'Notifications active (email + in-app)',
    'notifications_enabled_hint' => 'Active: in-app notifications are created. If a mail provider is configured below, the same notifications are additionally sent by email. Inactive: neither in-app notifications nor emails are produced, regardless of the mail configuration.',
    'app_settings'      => 'App Settings',
    'app_name_label'    => 'App Name',
    'app_url'           => 'Server URL',
    'app_url_hint'      => 'Base URL of this installation, e.g. https://example.com — used in email links.',
    'privacy_url'       => 'Privacy Policy (URL)',
    'imprint_url'       => 'Imprint (URL)',
    'privacy_policy'    => 'Privacy Policy',
    'imprint'           => 'Imprint',
    'allow_registration'              => 'Allow registration',
    'registration_domains'            => 'Allowed email domains',
    'registration_domains_placeholder'=> 'example.com, mycompany.org',
    'registration_domains_hint'       => 'One domain per line or comma-separated. Leave empty to allow all domains.',

    // Register
    'register_title'          => 'Create account',
    'register_subtitle'       => 'Sign up for a new account',
    'register_btn'            => 'Create account',
    'register_link'           => 'Create a new account',
    'register_success'        => 'Account created. Please sign in.',
    'register_username_short' => 'Name must be at least 3 characters',
    'register_email_invalid'  => 'Invalid email address',
    'register_password_short' => 'Password must be at least 8 characters',
    'register_duplicate'      => 'Email address is already taken',
    'register_domain_not_allowed' => 'Registration is not allowed for this email domain',

    // Email verification
    'verify_email_subject'  => 'Verify your email address',
    'verify_email_body'     => 'Please verify your email address by clicking the link below:',
    'verify_email_expires'  => 'This link is valid for 24 hours.',
    'verify_email_sent'     => 'Account created. Please check your inbox and verify your email address.',
    'verify_email_required' => 'Please verify your email address first. Check your inbox.',
    'verify_token_invalid'  => 'Invalid or expired verification link.',
    'verify_email_success'  => 'Email address verified. You can now sign in.',

    // Profile
    'my_profile'        => 'My Profile',
    'change_password'   => 'Change Password',
    'current_password'  => 'Current Password',
    'new_password'      => 'New Password',
    'profile_updated'   => 'Profile updated',
    'delete_account'         => 'Delete account',
    'delete_account_hint'    => 'This action is irreversible. Your account and all personal data will be permanently deleted.',
    'delete_account_confirm' => 'Really permanently delete your account?',
    'account_deleted'        => 'Account has been deleted.',
    'password_changed'  => 'Password changed',
    'password_wrong'    => 'Current password is incorrect',
    'password_mismatch' => 'Passwords do not match',

    // Notifications
    'mark_all_read'     => 'Mark all read',
    'no_notifications'  => 'No notifications',

    // TOTP / 2FA
    'totp_settings'       => 'Two-Factor Authentication',
    'totp_setup'          => 'Set up 2FA',
    'totp_setup_desc'     => 'Protect your account with a one-time password (TOTP). You need an authenticator app (e.g. Google Authenticator, Aegis or Bitwarden).',
    'totp_active'         => 'Active',
    'totp_inactive'       => 'Inactive',
    'totp_active_desc'    => 'Your authenticator app is active as a second factor. Enter a current code to disable it. You can also enable email verification as an additional second factor.',
    'totp_scan_desc'      => 'Scan the QR code with your authenticator app, then enter the displayed code to confirm.',
    'totp_manual_key'     => 'Manual key',
    'totp_copy'           => 'Copy',
    'totp_confirm_code'   => 'Confirmation code',
    'totp_confirm_hint'   => 'Enter the 6-digit code from your authenticator app.',
    'totp_enable'         => 'Enable 2FA',
    'totp_enabled_ok'     => 'Two-factor authentication enabled',
    'totp_disable'        => 'Disable 2FA',
    'totp_disable_hint'   => 'Enter a current code from your authenticator app.',
    'current_password_label' => 'Current password',
    'totp_disabled_ok'    => 'Two-factor authentication disabled',
    'totp_invalid'        => 'Invalid code. Please try again.',
    'totp_setup_step_up_title'    => 'Email verification required',
    'totp_setup_step_up_desc'     => 'To prevent unauthorised enrollment we will send a 6-digit code to :email. Confirm the code before adding an authenticator app.',
    'totp_setup_step_up_send_btn' => 'Send code by email',
    'totp_setup_step_up_sent'     => 'A verification code has been sent to your email address.',
    'totp_setup_step_up_code_label' => 'Verification code',
    'totp_setup_step_up_verify_btn' => 'Confirm code',
    'totp_setup_step_up_resend'   => 'Send a new code',
    'totp_setup_step_up_invalid'  => 'Invalid verification code.',
    'totp_setup_step_up_expired'  => 'The verification code has expired. Please request a new one.',
    'totp_setup_step_up_required' => 'Please confirm your email verification code before setting up 2FA.',
    'totp_setup_step_up_ok'       => 'Email address confirmed. You can now set up 2FA.',
    'totp_verify_title'   => 'Two-Factor Authentication',
    'totp_verify_subtitle'=> 'Enter the code from your authenticator app.',
    'totp_verify_btn'     => 'Verify',
    'totp_code'           => 'Authenticator code',
    'totp_enforce'        => 'Enforce TOTP globally',
    'totp_enforce_hint'   => 'All users without active TOTP will be forced to set it up on their next login.',
    'mfa_enforce'         => 'Enforce MFA',
    'mfa_enforce_hint'    => 'All users must authenticate with a TOTP app or email code in addition to their password.',
    'email_mfa_title'        => 'Email Verification',
    'email_mfa_desc'         => 'A 6-digit code has been sent to your email address. Please enter it below.',
    'email_mfa_code_label'   => 'Verification code',
    'email_mfa_submit'       => 'Verify',
    'email_mfa_invalid'      => 'Invalid or expired code.',
    'email_mfa_resend'       => 'Resend code',
    'email_mfa_resent'       => 'A new code has been sent to your email address.',
    'mfa_resend_too_fast'    => 'Please wait a moment before requesting a new code.',
    'mfa_attempts_exceeded'  => 'Too many failed attempts. Please log in again.',
    'email_mfa_settings'     => 'Email Two-Factor Authentication',
    'email_mfa_active'       => 'Active',
    'email_mfa_inactive'     => 'Inactive',
    'email_mfa_enable_btn'   => 'Enable email 2FA',
    'email_mfa_disable_btn'  => 'Disable email 2FA',
    'email_mfa_enable_desc'  => 'When enabled, you will receive a 6-digit code by email at each login.',
    'email_mfa_disable_desc' => 'Email two-factor authentication is currently active. You can disable it here.',
    'email_mfa_enabled_ok'   => 'Email 2FA has been enabled.',
    'email_mfa_disabled_ok'  => 'Email 2FA has been disabled.',
    'email_mfa_mail_subject' => 'Your login code',
    'email_mfa_mail_greeting'=> 'Hello,',
    'email_mfa_mail_body'    => 'Your verification code for login is:',
    'email_mfa_mail_expiry'  => 'This code is valid for 20 minutes.',
    'email_mfa_mail_warning' => 'If you did not request this code, please ignore this email.',
    'mfa_setup_title'        => 'Secure your account',
    'mfa_setup_desc'         => 'Your administrator requires two-factor authentication. Please choose a method.',
    'mfa_setup_email_title'  => 'Email code',
    'mfa_setup_email_desc'   => 'Receive a one-time code by email at each login.',
    'mfa_setup_totp_title'   => 'Authenticator app',
    'mfa_setup_totp_desc'    => 'Use an app like Google Authenticator or Authy.',
    'mfa_setup_back_choice'  => 'Change method',
    'mfa_choice_title'       => 'Confirm login',
    'mfa_choice_desc'        => 'You have two methods enabled. How would you like to verify?',
    'mfa_choice_totp_title'  => 'Authenticator app',
    'mfa_choice_totp_desc'   => 'Enter the code from your TOTP app.',
    'mfa_choice_email_title' => 'Email code',
    'mfa_choice_email_desc'  => 'Receive a code by email.',
    'ext_mfa_title'          => 'Verify your identity',
    'ext_mfa_desc'           => 'Since you have been inactive for a while, we have sent a 6-digit code to your email address. Please enter it below.',
    'ext_mfa_mail_greeting'  => 'Hello',
    'ext_mfa_mail_body'      => 'Your access code for the external task view is:',
    'ext_mfa_mail_subject'   => 'Your access code',
    'ext_mfa_resent'         => 'A new code has been sent to your email address.',
    'password_reset_enabled'      => 'Allow password reset',
    'password_reset_enabled_hint' => 'Shows a "Forgot password?" link on the login page. Requires mail sending to be configured.',
    'password_reset_requires_mail' => '(No mail transport configured — option disabled.)',
    'forgot_password'             => 'Forgot password?',
    'forgot_password_title'       => 'Reset password',
    'forgot_password_subtitle'    => 'Enter your email address and we\'ll send you a reset link.',
    'forgot_password_btn'         => 'Send link',
    'forgot_password_sent'        => 'If an account with that email exists, a reset link has been sent.',
    'reset_password_title'        => 'New password',
    'reset_password_subtitle'     => 'Enter your new password.',
    'reset_password_btn'          => 'Save password',
    'reset_password_success'      => 'Password changed successfully. Please sign in.',
    'reset_token_invalid'         => 'The link is invalid or has expired.',
    'back_to_login'               => 'Back to login',
    'totp_enforce_wizard_title'    => 'Security setup required',
    'totp_enforce_wizard_subtitle' => 'Your administrator requires two-factor authentication. Please set up TOTP now to continue.',
    'totp_enforce_note'   => 'This setup is mandatory. You can only sign in after activation.',

    // Project notifications
    'project_notifications'        => 'Email Notifications',
    'project_notifications_hint'   => 'Configure who receives email notifications for which events. Requires SMTP to be configured.',
    'notif_assignee_section'       => 'Notifications to assigned users',
    'notif_assignee_on_assign'     => 'When a task is assigned',
    'notif_assignee_on_comment'    => 'When a comment is posted',
    'notif_assignee_on_change'     => 'When deadline, priority or description is changed',
    'notif_assignee_reminder'      => 'Reminder 3 days before task deadline',
    'notif_assignee_on_due_day'    => 'Reminder on the due date',
    'notif_assignee_on_unassign'   => 'When removed from a task',
    'notif_assignee_on_attachment' => 'When a new attachment is uploaded',
    'notif_assignee_predecessors'  => 'When all predecessor tasks are completed',
    'notif_manager_section'        => 'Notifications to project managers',
    'notif_manager_any_activity'   => 'On any project activity',
    'notif_manager_assignees_changed' => 'When task assignees change',
    'activity_assignees_changed'   => 'changed assignees',
    'notif_manager_task_done'      => 'When a task is completed',
    'notif_manager_task_overdue'   => 'When a task is overdue (+1 day)',
    'notif_manager_task_created'   => 'When a new task is created',

    // External participants
    'dummy_assignees'            => 'Placeholders (no notification)',
    'external_participants'      => 'External Participants',
    'external_participants_hint' => 'External people receive email notifications and can view and update their tasks via a personal link.',
    'ext_name_placeholder'       => 'Name',
    'ext_email_placeholder'      => 'Email address',
    'ext_portal_link'            => 'Portal link',

    // AI
    'ai_settings'           => 'AI Integration',
    'ai_enabled'            => 'Enable AI globally',
    'ai_enabled_hint'       => 'Enables the AI assistant for all projects.',
    'ai_provider'           => 'Provider',
    'ai_ollama_url'         => 'Ollama URL',
    'ai_ollama_model'       => 'Model',
    'ai_claude_key'         => 'API Key',
    'ai_claude_key_hint'    => 'Leave blank to keep the existing key.',
    'ai_claude_model'       => 'Model',
    'ai_assistant'          => 'AI Assistant',
    'ai_clear_history'      => 'Clear history',
    'ai_empty_hint'         => 'Ask me anything or let me generate tasks for this project.',
    'ai_examples'           => 'Examples:',
    'ai_example_1'          => 'Generate all tasks needed to implement a ticket system',
    'ai_example_2'          => 'What tasks are still missing for the project?',
    'ai_example_3'          => 'Create a structured project plan with milestones',
    'ai_example_4'          => 'Ask me questions one by one about this project to deliver the right tasks',
    'ai_input_placeholder'  => 'Type a message … (Enter to send, Shift+Enter for new line)',
    'ai_generated_tasks'    => 'Generated Tasks',
    'ai_create_tasks'       => 'Create Tasks',

    // Activity
    'activity_task_created'  => 'created task',
    'activity_task_updated'  => 'updated task',
    'activity_task_deleted'  => 'deleted task',
    'activity_comment'       => 'commented on',
    'activity_status_changed'=> 'changed status of',
    'activity_member_added'  => 'added member to',

    // Invitations
    'invite'                  => 'Invite',
    'invite_title'            => 'Accept Invitation',
    'invite_subtitle_pre'     => 'You have been invited to join the group:',
    'invite_accept_btn'       => 'Accept Invitation',
    'invite_sent'             => 'Invitation has been sent by email.',
    'invite_link_fallback'    => 'SMTP not configured – invitation link (please send manually):',
    'invite_email_subject'    => 'You have been invited',
    'invite_email_body_intro' => 'has invited you to join the group:',
    'invite_email_expiry'     => 'This invitation link is valid for 7 days.',
    'invite_email_footer'     => 'If the button does not work, copy this link:',
    'invite_email_exists'     => 'This email address is already registered.',
    'invite_already_member'   => 'You are already a member of this group.',
    'invite_joined'           => 'You have successfully joined the group.',
    'invite_registered'       => 'Account created. Please sign in.',
    'invite_invalid_title'    => 'Invalid Invitation',
    'invite_invalid_body'     => 'This invitation link has expired or has already been used.',
    'invite_pending'          => 'Pending Invitations',
    'invite_revoke'           => 'Revoke',
    'invite_expires'          => 'Expires',
    'username_min'            => 'Name must be at least 3 characters',
    'password_min'            => 'Password must be at least 8 characters',
    'email_taken'             => 'Email address already taken',
    'invalid_email'           => 'Invalid email address',
    'admin_cannot_self_delete' => 'Admin accounts cannot be deleted from the profile page. Please ask another admin to delete the account.',

    // Email change with verification (security-audit #2)
    'email_change_pending'           => 'Email change requested. We sent a confirmation link to the new address. The change only takes effect after you click the link.',
    'email_change_pending_hint'      => 'Change to :email awaiting confirmation.',
    'email_change_token_invalid'     => 'Confirmation link is invalid or expired.',
    'email_change_success'           => 'Email address changed successfully.',
    'mail_email_change_verify_subject'  => 'Confirm email address',
    'mail_email_change_verify_greeting' => 'Hello :name,',
    'mail_email_change_verify_body'     => 'someone requested to change the email address of your Plenvo account to this address. Click the button to confirm the change:',
    'mail_email_change_verify_button'   => 'Confirm email address',
    'mail_email_change_verify_expires'  => 'The link is valid for 24 hours. If you did not request this change you can ignore this mail. The change will not take effect without confirmation.',
    'mail_email_change_notice_subject'  => 'Email change requested',
    'mail_email_change_notice_greeting' => 'Hello :name,',
    'mail_email_change_notice_body'     => 'a change of the email address for your account to :email was just requested.',
    'mail_email_change_notice_warning'  => 'If this was not you, change your password immediately and contact the administrator. The change will not take effect until confirmed via the new address.',

    // Password change session invalidation + notify (security-audit #14)
    'session_invalidated_password_changed' => 'Session ended because the password was changed. Please sign in again.',
    'mail_pw_changed_subject'   => 'Password changed',
    'mail_pw_changed_greeting'  => 'Hello :name,',
    'mail_pw_changed_body'      => 'the password for your account was just changed. All other active sessions have been ended for your safety.',
    'mail_pw_changed_warning'   => 'If you did not make this change, set a new password immediately and contact the administrator.',

    // Trust X-Forwarded-For toggle (security-audit #1 + #4)
    'sec_trustproxy_title'  => 'Reverse-proxy headers',
    'sec_trustproxy_desc'   => 'Only enable this when Plenvo runs behind a trusted reverse proxy (nginx, Traefik, …) that reliably sets "X-Forwarded-For". Otherwise clients can spoof their IP, bypassing rate limits and tampering with security-log entries.',
    'sec_trustproxy_enable' => 'Trust X-Forwarded-For from the reverse proxy',

    // Landing page
    'landing_meta_title'         => 'Project Management with Kanban, Gantt and AI',
    'landing_meta_desc'          => 'Plenvo is a lightweight project management software with Kanban board, Gantt chart, task management and AI assistant. Cloud or self-hosted, GDPR-compliant.',
    'landing_meta_keywords'      => 'project management, project management software, kanban board, gantt chart, task management, team collaboration, AI project planning, self-hosted, GDPR, open source',
    'landing_meta_og_title'      => 'Plenvo – Project Management for Teams',
    'landing_meta_og_alt'        => 'Plenvo dashboard with Kanban board and Gantt chart',
    'landing_software_desc'      => 'Web-based project management software with Kanban, Gantt, task lists, AI assistant, external sharing, and a self-hosting option.',
    'landing_breadcrumb_home'    => 'Home',
    'landing_breadcrumb_downloads' => 'Downloads',
    'landing_preview_eyebrow'    => 'Product Preview',
    'landing_preview_title'      => 'Your Project – Every Perspective',
    'landing_preview_sub'        => '',
    'landing_preview_tab_gantt'  => 'Gantt Chart',
    'landing_preview_tab_dashboard' => 'Dashboard',
    'landing_preview_tab_kanban' => 'Kanban Board',
    'landing_preview_tab_ai'      => 'AI Assistant',
    'landing_preview_tab_mytasks'  => 'My Tasks',
    'landing_preview_tab_external' => 'External View',
    'landing_badge'              => 'Modern Project Management',
    'landing_hero_title_1'       => 'Plan projects,',
    'landing_hero_title_2'       => 'lead teams.',
    'landing_hero_sub'           => 'Plenvo gives project managers the overview they need. From the first task to the completed project. Clear, structured, without chaos.',
    'landing_discover'           => 'Learn more',
    'landing_pill_made_in_germany' => 'Made in Germany',
    'landing_pill_gdpr'            => 'Built for GDPR',
    'landing_pill_opensource'      => 'Open Source',
    'landing_pill_selfhost_saas'   => 'Self-host or SaaS',
    'landing_diff_2_title'         => 'Every feature for everyone',
    'landing_diff_2_desc'          => 'No Pro or Enterprise tiers. No matter how large your team gets.',
    'landing_diff_3_title'         => 'AI assistant included',
    'landing_diff_3_desc'          => 'Plan tasks via chat. Run locally with Ollama or via cloud providers.',
    'landing_stat_views'         => 'Views',
    'landing_stat_projects'      => 'Projects',
    'landing_stat_security'      => 'Security',
    'landing_stat_ai'            => 'AI Assistant',
    'landing_pain_eyebrow'        => 'Sound familiar?',
    'landing_pain_title'          => 'Project management without the right tool costs time',
    'landing_pain_sub'            => 'Many teams struggle with the same problems every day. Plenvo solves them.',
    'landing_combined_eyebrow'    => 'Sound familiar?',
    'landing_combined_title'      => 'The right solution for every challenge',
    'landing_combined_sub'        => 'This is how Plenvo turns your daily challenges into measurable advantages.',
    'landing_combined_badge'      => 'Challenge',
    'landing_combined_extras'     => 'Also included:',

    // ── Pro features section ─────────────────────────────────────────
    'landing_pro_eyebrow'             => 'Pro features',
    'landing_pro_title'               => 'Tools you will not want to work without after a week',
    'landing_pro_sub'                 => 'The small features that never headline a demo – and that you will use every day.',
    'landing_pro_cat_speed'           => 'Speed',
    'landing_pro_cat_speed_sub'       => 'Fewer clicks. More done.',
    'landing_pro_cat_clarity'         => 'Clarity',
    'landing_pro_cat_clarity_sub'     => 'Stay on top without asking around.',
    'landing_pro_cat_tools'           => 'Tools',
    'landing_pro_cat_tools_sub'       => 'Pro functions that think along.',
    'landing_pro_cmdk_title'          => 'Command palette',
    'landing_pro_cmdk_desc'           => 'Reach any task, project or person in under a second. No clicking through menus.',
    'landing_pro_bulk_title'          => 'Bulk editing',
    'landing_pro_bulk_desc'           => 'Update twenty tasks at once: status, priority, assignees, due date, labels. One click instead of twenty.',
    'landing_pro_inline_title'        => 'Inline editing',
    'landing_pro_inline_desc'         => 'Change status, assignees and due date right in the table. No modal, no detour.',
    'landing_pro_managermail_title'   => 'Manager notifications',
    'landing_pro_managermail_desc'    => 'Receive only what matters: new tasks, assignee changes, completed predecessors. You pick the triggers.',
    'landing_pro_activity_title'      => 'Full audit trail',
    'landing_pro_activity_desc'       => 'The activity log records every change. Who did what, when? Never ask again.',
    'landing_pro_multiowner_title'    => 'Multiple owners',
    'landing_pro_multiowner_desc'     => 'Multiple owners and managers per project. Backup is built into the tool, not the calendar.',
    'landing_pro_autodeps_title'      => 'Gantt auto-link',
    'landing_pro_autodeps_desc'       => 'Plenvo detects dependencies automatically from the schedule, including parallel tracks and fan-in / fan-out.',
    'landing_pro_dragdrop_title'      => 'Drag and drop everywhere',
    'landing_pro_dragdrop_desc'       => 'Move bars in the Gantt, drag cards on the Kanban. Dates and status update instantly.',
    'landing_pro_aichoice_title'      => 'AI of your choice',
    'landing_pro_aichoice_desc'       => 'Anthropic Claude, OpenAI, Azure or local Ollama. No vendor lock-in on intelligence.',
    'landing_pro_extras_title'        => 'Also on board',
    'landing_pro_extra_mentions'      => '@-mentions in comments',
    'landing_pro_extra_attach'        => 'File attachments',
    'landing_pro_extra_custom_status' => 'Custom status per project',
    'landing_pro_extra_labels'        => 'Labels',
    'landing_pro_extra_required'      => 'Required fields per project',
    'landing_pro_extra_polls'         => 'Scheduling polls',
    'landing_pro_extra_languages'     => '11 UI languages',
    'landing_pro_extra_themes'        => '10 themes',
    'landing_pro_extra_fido'          => 'WebAuthn / FIDO2',
    'landing_pro_extra_mfa'           => 'TOTP + email MFA',
    'landing_pro_extra_archive'       => 'Archive & restore',
    'landing_pro_extra_deps'          => 'Task dependencies',

    // ── Scheduling polls highlight ───────────────────────────────────
    'landing_poll_bonus'         => 'Bonus',
    'landing_poll_title'         => 'Need to pick a date? Plenvo schedules that too.',
    'landing_poll_sub'           => 'A full-featured scheduling poll is built in. Same language, same GDPR setup, same interface – no second tool needed.',
    'landing_poll_feat_link'     => 'Public link – participate without an account.',
    'landing_poll_feat_live'     => 'Live results with the winning slot highlighted automatically.',
    'landing_poll_feat_invite'   => 'Invite by email, internal and external.',
    'landing_poll_feat_finalize' => 'One click to finalize, mail to every participant.',
    'landing_poll_mock_title'    => 'Q1 kickoff 2026',
    'landing_poll_mock_meta'     => '4 participants · until Apr 12',
    'landing_poll_mock_count'    => '3 of 4 responded',
    'landing_poll_mock_cta'      => 'Lock in slot',
    'landing_pain1_title'         => 'No overview of project status',
    'landing_pain1_desc'          => 'Who is working on what? What is still open? What is overdue?',
    'landing_pain1_solution'      => 'The Plenvo dashboard shows open tasks, overdue items and team activity. All at a glance, in real time.',
    'landing_pain2_title'         => 'Deadlines are missed',
    'landing_pain2_desc'          => 'Dependencies between tasks are overlooked, deadlines are missed.',
    'landing_pain2_solution'      => 'The Gantt timeline makes dependencies visible. Spot bottlenecks before they become problems.',
    'landing_pain3_title'         => 'Team communication runs via email',
    'landing_pain3_desc'          => 'Status updates get lost, responsibilities are unclear.',
    'landing_pain3_solution'      => 'Every task has clear owners, comments and status. All in one place, no email chains.',
    'landing_pain4_title'         => 'External partners hard to involve',
    'landing_pain4_desc'          => 'Contractors and clients need their own tools or access.',
    'landing_pain4_solution'      => 'Externals get a personal link to their tasks. No account needed, no setup effort.',
    'landing_pain5_title'         => 'Unclear team workload',
    'landing_pain5_desc'          => 'Tasks are assigned twice or team members are unknowingly overloaded.',
    'landing_pain5_solution'      => 'Assign tasks deliberately and always keep track of who has taken on what.',
    'landing_pain6_title'         => 'Status meetings waste valuable time',
    'landing_pain6_desc'          => 'The same questions every week: what is the status, what is still missing?',
    'landing_pain6_solution'      => 'With Plenvo, everyone has the current status at their fingertips. Fewer meetings, more results.',
    'landing_features_eyebrow'   => 'Features',
    'landing_features_title'     => 'Everything your team needs',
    'landing_features_sub'       => 'From individual tasks to full project plans. Plenvo covers every step of your workflow.',
    'landing_feat_overview'      => 'Complete Overview',
    'landing_feat_overview_desc' => 'The dashboard shows at a glance: open tasks, today\'s due dates, overdue items and your team\'s activity. No searching required.',
    'landing_feat_timeline'      => 'Timeline with Gantt',
    'landing_feat_timeline_desc' => 'Drag and drop tasks directly on the timeline. Instantly see when a deadline is at risk and react before it\'s too late.',
    'landing_feat_team'          => 'Clear Responsibilities',
    'landing_feat_team_desc'     => 'Every task has one or more owners. Project roles (owner, manager, member) ensure everyone knows exactly what is expected of them.',
    'landing_feat_priority'      => 'Priorities & Deadlines',
    'landing_feat_priority_desc' => 'Four priority levels, due dates and email reminders ensure the most important things get done first.',
    'landing_feat_kanban'        => 'Kanban Board',
    'landing_feat_kanban_desc'   => 'Visualize your workflow with flexible columns, drag-and-drop and configurable status transitions.',
    'landing_feat_gantt'         => 'Gantt Chart',
    'landing_feat_gantt_desc'    => 'See your timeline at a glance: drag and resize tasks directly in the chart, with weekend highlighting.',
    'landing_feat_tasks'         => 'Task Management',
    'landing_feat_tasks_desc'    => 'Priorities, due dates, labels, comments and file attachments. All in one place.',
    'landing_feat_deps'          => 'Dependencies',
    'landing_feat_deps_desc'     => 'Define predecessors and successors. Automatic notification when all predecessors are completed.',
    'landing_feat_groups'        => 'Multi-Tenancy',
    'landing_feat_groups_desc'   => 'Organize users in groups and delegate group admins. Each group works in its own isolated environment.',
    'landing_feat_external'      => 'External Access',
    'landing_feat_external_desc' => 'Share tasks with external partners via personal link. No account required, with targeted access rights.',
    'landing_feat_ai'            => 'AI Assistant',
    'landing_feat_ai_desc'       => 'Let tasks be generated automatically. Supports Ollama (local) and Claude API for privacy-friendly configuration.',
    'landing_feat_notif'         => 'Email Notifications',
    'landing_feat_notif_desc'    => 'Assignment, due date, predecessors done. All relevant events land automatically in the inbox.',
    'landing_feat_files'         => 'File Attachments',
    'landing_feat_files_desc'    => 'Attach documents, images and more directly to tasks. Securely stored and always accessible.',
    'landing_how_eyebrow'        => 'In 4 steps',
    'landing_how_title'          => 'Get started immediately',
    'landing_how_sub'            => 'No lengthy setup. Plenvo is ready to use within minutes.',
    'landing_step1_title'        => 'Sign in',
    'landing_step1_desc'         => 'Log in with your account or accept an invitation.',
    'landing_step2_title'        => 'Create project',
    'landing_step2_desc'         => 'Create a project, choose a color, set the default view.',
    'landing_step3_title'        => 'Invite team',
    'landing_step3_desc'         => 'Invite members by email or assign existing users.',
    'landing_step4_title'        => 'Manage tasks',
    'landing_step4_desc'         => 'Create, prioritize and assign tasks in Kanban, list or Gantt view.',
    'landing_views_eyebrow'      => 'Views',
    'landing_views_title'        => 'Every perspective on your project',
    'landing_views_sub'          => 'Switch between views at any time. The data always stays in sync.',
    'landing_view_kanban'         => 'Kanban Board',
    'landing_view_kanban_desc'    => 'Drag and drop tasks through your workflow',
    'landing_view_list'           => 'List View',
    'landing_view_list_desc'      => 'Filter, sort and see all tasks at a glance',
    'landing_view_gantt'          => 'Gantt Chart',
    'landing_view_gantt_desc'     => 'Visualize your schedule and spot dependencies',
    'landing_view_dashboard'      => 'Dashboard',
    'landing_view_dashboard_desc' => 'Project status, open tasks and team activity',
    'landing_tag_dashboard'       => 'Dashboard',
    'landing_tag_gantt'           => 'Gantt Chart',
    'landing_tag_team'            => 'Team Management',
    'landing_tag_tasks'           => 'Tasks',
    'landing_tag_planning'        => 'Planning',
    'landing_tag_collab'          => 'Collaboration',
    'landing_tag_notif'           => 'Notifications',
    'landing_tag_ai'              => 'AI Assistant',
    'landing_security_title'     => 'Security by Design',
    'landing_security_sub'       => 'Plenvo was built from the ground up with security as a priority.',
    'landing_sec_totp'           => 'Two-Factor Auth',
    'landing_sec_totp_desc'      => 'TOTP via authenticator app, optionally enforced globally',
    'landing_sec_csrf'           => 'CSRF Protection',
    'landing_sec_csrf_desc'      => 'All forms and API endpoints protected by tokens',
    'landing_sec_groups'         => 'Data Isolation',
    'landing_sec_groups_desc'    => 'Groups are fully isolated from each other',
    'landing_sec_brute'          => 'Brute-Force Protection',
    'landing_sec_brute_desc'     => 'Rate limiting on all login attempts',
    'landing_sec_bcrypt'         => 'Secure Passwords',
    'landing_sec_bcrypt_desc'    => 'BCrypt hashing, no plaintext in the database',
    'landing_sec_audit'          => 'Activity Log',
    'landing_sec_audit_desc'     => 'All changes are traceable and logged',
    'landing_no_account'         => 'No account yet?',

    // Landing mock UI
    'landing_mock_status_open'        => 'Open',
    'landing_mock_status_inprogress'  => 'In Progress',
    'landing_mock_status_review'      => 'Review',
    'landing_mock_status_done'        => 'Done',
    'landing_mock_welcome'            => 'Welcome back, Max',
    'landing_mock_date'               => 'April 23, 2026',
    'landing_mock_filter_open'        => 'Open Tasks',
    'landing_mock_task_req'           => 'Requirements Analysis',
    'landing_mock_task_design'        => 'Design Concept',
    'landing_mock_task_frontend'      => 'Frontend Development',
    'landing_mock_task_backend'       => 'Backend API',
    'landing_mock_task_testing'       => 'Testing & QA',
    'landing_mock_task_content'       => 'Content Migration',
    'landing_mock_task_golive'        => 'Go-Live',
    'landing_mock_task_pushnotif'     => 'Push Notifications',
    'landing_mock_task_appstore'      => 'App Store Release',
    'landing_mock_card_server'        => 'Plan Server Infrastructure',
    'landing_mock_card_seo'           => 'Conduct SEO Analysis',
    'landing_mock_card_privacy'       => 'Review Data Privacy',
    'landing_mock_card_backenddev'    => 'Develop Backend API',
    'landing_mock_card_designfinal'   => 'Finalize Design Concept',
    'landing_mock_card_kickoff'       => 'Kick-off Meeting',
    'landing_mock_ai_user_msg'        => 'Can you create all necessary tasks for the Website Relaunch 2026 project – with realistic start and end dates and predecessor/successor links?',
    'landing_mock_ai_intro'           => 'Of course! Here are',
    'landing_mock_ai_for'             => 'for',
    'landing_mock_ai_timeline'        => 'with timeline and all dependencies:',
    'landing_mock_ai_dep_after'       => '→ after',
    'landing_mock_ai_confirm'         => 'All dependencies are linked. Shall I create the tasks directly?',
    'landing_mock_ai_cta_text'        => '7 tasks generated &amp; linked',
    'landing_mock_ai_create'          => 'Create Tasks',
    'landing_mock_ext_open'           => 'Open task',
    'landing_mock_ext_task1_title'    => 'Content Migration',
    'landing_mock_ext_task1_desc'     => 'Transfer all content from the legacy system, structure it and prepare it for the new website.',
    'landing_mock_ext_task2_title'    => 'Go-Live Preparation',
    'landing_mock_ext_task2_desc'     => 'Final approval of all pages, check URL redirects and give the green light for launch.',
    'landing_mock_ext_task3_title'    => 'Approval &amp; Feedback',
    'landing_mock_ext_task3_desc'     => 'Give final approval for the entire relaunch and leave written feedback on the implementation.',

    // Landing FAQs
    'landing_faq_title'  => 'Frequently Asked Questions',
    'landing_faq_sub'    => 'Answers to the most important questions about Plenvo.',
    'landing_faq_help'   => 'Find more details in the <a href="/help" style="color:#4f46e5;font-weight:600">user guide</a>.',
    'landing_faq_1_q'    => 'Do I need an account to view tasks?',
    'landing_faq_1_a'    => 'Not necessarily. As an external participant you receive a personal access link by email. Using this link you can view your assigned tasks, update their status and leave comments – without any account.',
    'landing_faq_2_q'    => 'How do I invite someone to a project?',
    'landing_faq_2_a'    => 'Project managers can add internal users or invite external participants by email under <em>Members</em>. Externals receive a unique access link. Group admins can add users to the group via an invitation link.',
    'landing_faq_3_q'    => 'What is the difference between Kanban, List and Gantt?',
    'landing_faq_3_a'    => 'The <strong>Kanban board</strong> shows tasks as cards that you move between status columns via drag &amp; drop. The <strong>list view</strong> is ideal for filtering and sorting. The <strong>Gantt chart</strong> visualizes tasks on a timeline, shows dependencies as connecting lines and can be edited via drag &amp; drop. With the <em>Auto-Link</em> button, Plenvo automatically detects which tasks follow each other in time and creates the appropriate dependencies.',
    'landing_faq_4_q'    => 'What happens when I mark a task as "done"?',
    'landing_faq_4_a'    => 'The task moves to the completed status. Depending on the project settings, the project manager and/or the assignees of dependent successor tasks receive an email notification.',
    'landing_faq_5_q'    => 'What are predecessor tasks?',
    'landing_faq_5_a'    => 'Predecessors are tasks that must be completed first before another task can be meaningfully worked on. In the Gantt chart these dependencies are shown as connecting lines. With the <em>Auto-Link</em> function in the Gantt chart, all dependencies can be automatically derived from the schedule — even with multiple tasks running in parallel. When a predecessor is completed, a notification can optionally be sent to the assignee of the following task.',
    'landing_faq_6_q'    => 'How do I secure my account with 2FA?',
    'landing_faq_6_a'    => 'Under <em>Settings → Security</em> you can activate either an authenticator app (TOTP) or email confirmation. Both methods can be used simultaneously. If your administrator enforces MFA, you will automatically be prompted to set it up on your next login.',
    'landing_faq_7_q'    => 'Who can create a project?',
    'landing_faq_7_a'    => 'Any logged-in user can create a new project. Whoever creates a project automatically becomes its owner and has full control over members, tasks and settings.',
    'landing_faq_8_q'    => 'Can I belong to multiple projects?',
    'landing_faq_8_a'    => 'Yes. You can be a member of any number of projects, each with its own role (owner, manager, member or guest). You can see your tasks from all projects collected under "My Tasks".',
    'landing_faq_9_q'    => 'Can the AI feature be disabled?',
    'landing_faq_9_a'    => 'Yes. Group admins can individually enable or disable AI access for their group. This allows the AI to be used only where it is wanted.',
    'landing_faq_10_q'   => 'What data can the AI access?',
    'landing_faq_10_a'   => 'The AI automatically receives the project name and – if available – the project description, as well as the messages you enter in the chat. Tasks, team members or other project data are not automatically transmitted. You decide what additional information you share with the AI.',

    // Hosting options section
    'landing_hosting_eyebrow'        => 'Two ways, one product',
    'landing_hosting_title'          => 'Hosted or self-operated — your choice',
    'landing_hosting_subtitle'       => 'Plenvo adapts to your infrastructure. Start instantly in the cloud or install the software on your own server.',
    'landing_hosting_saas_badge'     => 'Software as a Service',
    'landing_hosting_saas_title'     => 'Fully hosted',
    'landing_hosting_saas_desc'      => 'No server, no maintenance. Operations, updates and availability are included. Simply register and get started.',
    'landing_hosting_saas_1'         => 'Ready to use instantly, no setup',
    'landing_hosting_saas_2'         => 'Automatic updates to new versions',
    'landing_hosting_saas_3'         => 'Operations & maintenance included',
    'landing_hosting_saas_cta'       => 'Register now',
    'landing_hosting_self_badge'     => 'Self-Hosted',
    'landing_hosting_self_title'     => 'On your own server',
    'landing_hosting_self_desc'      => 'Full control over your data. Install Plenvo on your own infrastructure — free of charge and without dependencies.',
    'landing_hosting_self_1'         => 'Your data stays on your server',
    'landing_hosting_self_2'         => 'Free to download and install',

    // Downloads page
    'dl_hero_sub'      => 'Stable release &ndash; self-hosted, no dependencies, no cloud lock-in.',
    'dl_download_btn'  => 'Download plenvo-latest.zip',
    'dl_req_title'              => 'System requirements',
    'dl_req_php'                => 'PHP 8.1 or newer',
    'dl_req_sqlite'             => 'SQLite (bundled with PHP)',
    'dl_req_webserver'          => 'Apache, nginx, or similar web server',
    'dl_quickstart_title'       => 'Up and running in 3 steps',
    'dl_quickstart_step1_title' => 'Unpack the ZIP',
    'dl_quickstart_step1_desc'  => 'Download the archive and unpack it locally.',
    'dl_quickstart_step2_title' => 'Copy to your server',
    'dl_quickstart_step2_desc'  => 'Upload the extracted folder via FTP/SSH to your PHP host\'s web directory.',
    'dl_quickstart_step3_title' => 'Open index.php',
    'dl_quickstart_step3_desc'  => 'Open the installed URL in your browser. Setup will guide you through the initial configuration.',
    'dl_sha_copy'               => 'Copy',
    'dl_sha_copied'             => 'Copied!',
    'dl_sha_verify_hint'        => 'Use `sha256sum plenvo-latest.zip` to verify integrity.',
    'dl_changelog_jump'         => 'Jump to:',
    'dl_readme_hint'   => 'Contains requirements, setup instructions, privacy and license information:',
    'dl_readme_open'   => 'Open README',
    'dl_changelog_eyebrow' => 'Release Notes',
    'dl_meta_title'    => 'Plenvo Download – Self-Hosted Project Management Software',
    'dl_meta_desc'     => 'Download Plenvo for free. Self-hosted project management software with Kanban, Gantt, AI assistant and built-in auto-updater. Powered by PHP and SQLite, no external dependencies.',
    'dl_meta_keywords' => 'Plenvo download, project management software download, self-hosted, kanban software, gantt software, open source project management',
    'landing_hosting_self_3'         => 'Built-in auto-updater for easy upgrades',
    'landing_hosting_self_cta'       => 'Download',
    // Contact form (landing page)
    // WebAuthn / Security Keys
    'webauthn_settings'         => 'Security Keys (YubiKey / FIDO2)',
    'webauthn_desc'             => 'Sign in with a physical security key (e.g. YubiKey) — no password required. The key must be registered here first.',
    'webauthn_add_key'          => 'Register key',
    'webauthn_key_name'         => 'Name',
    'webauthn_key_name_ph'      => 'e.g. YubiKey 5',
    'webauthn_default_key_name' => 'Security Key',
    'webauthn_registered_count' => 'registered',
    'webauthn_registered_on'    => 'Registered on',
    'webauthn_last_used'        => 'Last used',
    'webauthn_touch_key'        => 'Touch your key or enter PIN …',
    'webauthn_register_success' => 'Security key registered successfully.',
    'webauthn_register_error'   => 'Registration failed. Please try again.',
    'webauthn_login_btn'        => 'Sign in with security key',
    'webauthn_login_success'    => 'Authentication successful.',
    'webauthn_cancelled'        => 'Cancelled.',

    'contact_nav'               => 'Contact',
    'contact_eyebrow'           => 'Contact',
    'contact_title'             => 'Get in Touch',
    'contact_subtitle'          => 'Found a bug, have a feature idea, or just want to share feedback? Every message is welcome.',
    'contact_name'              => 'Name',
    'contact_category'          => 'Category',
    'contact_category_ph'       => 'Please select ...',
    'contact_cat_bug'           => 'Report a bug',
    'contact_cat_feature'       => 'Feature request',
    'contact_cat_praise'        => 'Praise',
    'contact_cat_critique'      => 'Criticism',
    'contact_cat_question'      => 'General question',
    'contact_cat_other'         => 'Other',
    'contact_message'           => 'Message',
    'contact_max_chars'         => 'max. 5,000 characters',
    'contact_submit'            => 'Send message',
    'contact_success'           => 'Message sent! A reply will follow as soon as possible.',
    'contact_error_generic'     => 'An error occurred.',
    'contact_error_network'     => 'Connection error. Please try again later.',
    'contact_err_not_configured'=> 'The contact form is not configured on this server.',
    'contact_err_invalid'       => 'Invalid request.',
    'contact_err_too_fast'      => 'Please wait a moment and try again.',
    'contact_err_rate_limit'    => 'Please wait before sending another message.',
    'contact_err_name'          => 'Please enter a valid name (max. 100 characters).',
    'contact_err_email'         => 'Please enter a valid email address.',
    'contact_err_category'      => 'Please select a category.',
    'contact_err_message'       => 'Message must be between 10 and 5,000 characters.',
    'contact_err_send'          => 'Email could not be sent. Please try again later.',

    'landing_license_title'          => 'Open Source – AGPL v3',
    'landing_license_body'           => 'Plenvo is released under the <strong>GNU Affero General Public License v3</strong>. The software may be used, operated and inspected free of charge. Redistribution or modification of the source code is only permitted under the same license terms. Installations must visibly retain the "Powered by Plenvo" notice linking to <a href="https://plenvo.gp-server.com" target="_blank" rel="noopener" style="color:#4f46e5;text-decoration:none;font-weight:600">plenvo.gp-server.com</a>.',

    // Layout / Navigation
    'delete_all'                  => 'Delete all',
    'pending_count'               => 'pending',

    // Preferences page
    'preferred_project_view'      => 'Preferred project view',
    'preferred_view_hint'         => 'This view is automatically pre-selected when you create a new project.',
    'request_group_creation_hint' => 'You can request permission from the administrator to create your own groups.',
    'group_creation'              => 'Create group',
    'permission_active'           => 'Permission active',
    'permission_active_desc'      => 'You can create your own groups.',
    'request_pending_status'      => 'Request pending',
    'request_pending_desc'        => 'Your request is being reviewed by an administrator.',
    'request_denied_status'       => 'Denied',
    'request_denied_desc'         => 'Your last request was denied.',
    'request_again'               => 'Request again',
    'permission_revoked_status'   => 'Permission revoked',
    'permission_revoked_desc'     => 'Your permission was revoked by an administrator.',
    'request_access'              => 'Request access',

    // Group requests (admin)
    'group_requests_title'        => 'Group requests',
    'group_creation_requests'     => 'Group creation requests',
    'no_requests'                 => 'No requests yet.',
    'status_label'                => 'Status',
    'date_label'                  => 'Date',
    'pending_status'              => 'Pending',
    'approved_status'             => 'Approved',
    'revoked_status'              => 'Revoked',
    'denied_status'               => 'Denied',
    'approve'                     => 'Approve',
    'deny'                        => 'Deny',
    'confirm_deny'                => 'Deny request?',
    'revoke_permission'           => 'Revoke permission',
    'confirm_revoke_permission'   => 'Revoke permission?',
    'approve_again'               => 'Approve again',
    'grant_permission_direct'     => 'Grant permission directly',
    'grant_permission'            => 'Grant permission',

    // Plugins (admin)
    'installed_plugins'           => 'Installed plugins',
    'no_plugins'                  => 'No plugins installed.',
    'plugin_version'              => 'Version',
    'plugin_active'               => 'Active',
    'plugin_disabled'             => 'Disabled',
    'plugin_deactivate'           => 'Deactivate',
    'plugin_activate'             => 'Activate',
    'plugin_delete_confirm'       => 'Really delete plugin?',
    'plugin_upload_title'         => 'Upload plugin',
    'plugin_upload_label'         => 'ZIP file (max. 5 MB)',
    'plugin_upload_btn'           => 'Upload & install',
    'plugin_structure_title'      => 'Plugin structure',
    'plugin_upload_hint'          => 'Upload a plugin as a <strong>.zip</strong> file. The ZIP must contain a <code>plugin.json</code> with the fields <code>id</code>, <code>name</code> and <code>class</code>.',
    'plugin_structure_hint'       => 'Minimal <code>plugin.json</code>:',
    'plugin_class_hint'           => 'The class must have a <code>register()</code> method and be placed as <code>ClassName.php</code> in the same directory.',

    // Users (admin)
    'pw_reset_short'              => 'PW Reset',
    'reset_btn'                   => 'Reset',

    // Group admin
    'new_group'                   => 'New group',
    'new_group_title'             => 'Create new group',
    'no_group_yet'                => 'You don\'t have a group yet. Create your first group now.',
    'group_name_label'            => 'Group name',
    'group_name_placeholder'      => 'e.g. Marketing, Development…',
    'group_desc_placeholder'      => 'Brief description of the group…',
    'group_admin_auto'            => 'You will automatically be added as group admin.',
    'create_btn'                  => 'Create',
    'ai_blocked_label'            => 'AI blocked',
    'ai_active_label'             => 'AI active',
    'ai_block_confirm'            => 'Block AI for all members of this group?',
    'ai_blocked_title'            => 'AI is blocked – click to enable',
    'ai_active_title'             => 'AI is active – click to block',
    'delete_group'                => 'Delete group',
    'delete_group_confirm'        => 'Really delete group? This action cannot be undone.',
    'me_badge'                    => 'Me',
    'reset_password_btn'          => 'Reset',
    'no_permission_hint'          => 'No permission – request in settings',

    // Notifications
    'open_btn'                    => 'Open',

    // Invite accept
    'invite_wrong_user'           => 'This invitation was sent to a different email address and cannot be accepted with your account.',
    'invite_to_dashboard'         => 'Go to dashboard',
    'invite_login_required'       => 'Sign in with this account to join the group.',
    'invite_login_btn'            => 'Sign in & accept invitation',
    'invite_join_text'            => 'You have been invited to join the group.',
    'invite_join_btn'             => 'Accept invitation',

    // Gantt
    'manual'                      => 'Manual',

    // Admin settings
    'smtp_external_badge'         => 'External SMTP – no local mail server',
    'smtp_info_text'              => 'The system uses <strong>exclusively</strong> the configured SMTP server. Local mail dispatch (sendmail/mail) is disabled.',
    'keep_password_hint'          => 'Leave blank to keep the current password',
    'mail_settings'               => 'Mail Settings',
    'mail_queue_title'            => 'Mail Queue',
    'mail_queue_desc'             => 'Outbound emails are buffered in the queue and dispatched by cron in the background.',
    'mail_queue_pending'          => 'Pending',
    'mail_queue_stuck'            => 'Given up',
    'mail_queue_oldest'           => 'Oldest pending',
    'mail_queue_open'             => 'Open queue',
    'mail_queue_clear_all'        => 'Clear all',
    'mail_queue_clear_stuck'      => 'Clear given-up',
    'mail_queue_clear_sent'       => 'Remove sent',
    'mail_queue_confirm_all'      => 'Really clear every entry in the mail queue? Pending emails will be lost.',
    'mail_queue_confirm_stuck'    => 'Really delete every given-up entry?',
    'mail_queue_confirm_sent'     => 'Really remove the history of sent emails?',
    'mail_queue_empty'            => 'The mail queue is empty.',
    'mail_queue_state_pending'    => 'Pending',
    'mail_queue_state_stuck'      => 'Given up',
    'mail_queue_state_sent'       => 'Sent',
    'hc_mail_queue'               => 'Mail Queue',
    'hc_mail_queue_empty'         => 'Queue is empty.',
    'hc_mail_queue_pending'       => ':n email(s) waiting for delivery.',
    'hc_mail_queue_backlog'       => ':n email(s) pending for over :m minutes — cron worker is not reaching the queue.',
    'hc_mail_queue_stuck'         => ':n email(s) given up after the maximum delivery attempts.',
    'mail_provider'               => 'Mail Provider',
    'mail_provider_smtp'          => 'SMTP',
    'mail_provider_microsoft'     => 'Microsoft 365 (OAuth)',
    'mail_provider_local'         => 'Local mail (sendmail)',
    'local_mail_info_text'        => 'Emails are sent via the server\'s local mail configuration (PHP mail() / sendmail). No external mail server required. A sender address and name can optionally be configured.',
    'ms_tenant_id'                => 'Tenant ID',
    'ms_client_id'                => 'Client ID',
    'ms_client_secret'            => 'Client Secret',
    'ms_from_email'               => 'Sender Email',
    'ms_info_text'                => 'Send email via Microsoft Graph API (OAuth 2.0 client credentials). Create an app registration in Azure, grant the Mail.Send application permission, and enter Tenant ID, Client ID, and Client Secret below.',
    'ms_test_ok'                  => 'Microsoft connection successful – authentication OK',
    'ms_test_fail'                => 'Microsoft connection failed – check your credentials',
    'ms_missing_fields'           => 'Tenant ID, Client ID, and Client Secret are required',
    'ollama_url_hint'             => 'Local or remote, e.g. https://my-server.com',
    'ai_rate_limited'             => 'Too many messages. Please wait one hour before sending more.',
    'ai_authentication'           => 'Authentication',
    'auth_none_label'             => 'None (local installation)',
    'bearer_token_hint'           => 'For ollama.com: API key from account settings',
    'openai_key_hint'             => 'OpenAI API key from platform.openai.com',
    'model_label'                 => 'Model',
    'azure_endpoint_label'        => 'Azure Endpoint',
    'azure_endpoint_hint'         => 'The base URL of your Azure OpenAI resource',
    'deployment_label'            => 'Deployment',
    'api_version_label'           => 'API Version',
    'api_key_label'               => 'API Key',
    'azure_key_hint'              => 'Found in Azure Portal → your OpenAI resource → Keys and Endpoint',
    'load_models'                 => 'Load models',
    'stored_placeholder'          => '(saved)',
    'password_min'                => 'Password must be at least 8 characters',
    'new_password_min'            => 'New password must be at least 8 characters',
    'password_reset_success'      => 'Password reset',
    'request_approved'            => 'Request approved.',
    'request_denied'              => 'Request denied.',
    'notif_group_approved_title'  => 'Group request approved',
    'notif_group_approved_msg'    => 'Your request to create groups has been approved.',
    'notif_group_denied_title'    => 'Group request denied',
    'notif_group_denied_msg'      => 'Your request to create groups was unfortunately denied.',
    'status_updated'              => 'Status updated',
    'comment_saved'               => 'Comment saved.',
    'invalid_request'             => 'Invalid request.',
    'plugin_deleted'              => 'Plugin deleted.',
    'plugin_uploaded'             => 'Plugin uploaded and installed.',
    'plugin_delete_error'         => 'Plugin could not be deleted.',
    'plugin_lock_active_hint'     => 'This plugin is permanently active. Disabling it would lift the data isolation it guarantees and cause a privacy incident.',
    'plugin_lock_active_error'    => 'This plugin cannot be disabled or removed because it guarantees permanent data isolation.',
    'zip_only'                    => 'Only ZIP files allowed.',
    'zip_not_supported'           => 'ZIP support not available.',
    'zip_not_openable'            => 'ZIP could not be opened.',
    'upload_failed'               => 'Upload failed.',
    'file_too_large'              => 'File too large (max. 5 MB).',
    'zip_path_traversal'          => 'Invalid ZIP (path traversal detected).',
    'zip_no_manifest'             => 'No plugin.json found in ZIP.',
    'invalid_plugin_json'         => 'Invalid plugin.json (id and class are required).',
    'invalid_plugin_id'           => 'Invalid plugin ID (only letters, numbers, - and _).',
    'name_required'               => 'Name is required',
    'group_name_required'         => 'Group name is required.',
    'group_created_success'       => 'Group was successfully created.',
    'group_invite_notif_title'    => 'Group invitation',
    'title_required'              => 'Title is required',
    'description_required'        => 'Description is required',
    'due_date_required'           => 'Due date is required',
    'image_only'                  => 'Only images allowed (jpg, png, gif, webp)',
    'image_too_large'             => 'Image max. 2MB',
    'avatar_updated'              => 'Avatar updated',
    'new_group_request_title'     => 'New group request',
    'new_group_request_msg'       => '%s is requesting permission to create groups.',
    'group_request_sent'          => 'Your request has been sent and will be reviewed by the administrator.',
    'invite_not_found'            => 'Invitation not found or expired',
    'invite_wrong_account'        => 'This invitation does not apply to your account',
    'invite_join_error'           => 'Error joining group',
    'group_invite_notif_msg'      => '%s has invited you to the group "%s".',
    'model_load_unknown_provider' => 'Unknown provider.',
    'model_load_failed'           => 'Connection failed – please check credentials.',
    'project_create_error'        => 'Error creating project',
    'status_open'                 => 'Open',
    'status_in_progress'          => 'In Progress',
    'status_review'               => 'Review',
    'status_done'                 => 'Done',
    'project_label'               => 'Project',
    'gantt_weeks'                 => 'Weeks',
    'gantt_months'                => 'Months',
    'gantt_auto_deps'             => 'Auto-link',
    'gantt_auto_deps_title'       => 'Automatically create dependencies from schedule',
    'gantt_clear_deps'            => 'Clear links',
    'gantt_clear_deps_title'      => 'Remove all dependencies in this project',
    'gantt_confirm_clear_deps'    => 'Remove all dependencies in this project?',
    'gantt_clear_dates'           => 'Clear dates',
    'gantt_clear_dates_title'     => 'Remove all start & due dates from tasks',
    'gantt_confirm_clear_dates'   => 'Remove all start & due dates from all tasks?',

    'powered_by_plenvo'   => 'Powered by Plenvo',

    // Auto-updater
    'update_nav'               => 'Updates',
    'update_title'             => 'System Update',
    'update_status'            => 'Update Status',
    'update_installed_version' => 'Installed Version',
    'update_available_version' => 'Available Version',
    'update_new'               => 'New version available',
    'update_latest'            => 'Up to date',
    'update_preview'           => 'Preview version',
    'update_check_failed'      => 'Check failed – server unreachable',
    'update_changelog'         => 'Changes',
    'update_force_check'       => 'Check again',
    'update_now'               => 'Update to :version',
    'update_confirm'           => 'Update to the new version now? Make sure to back up your data/ folder first.',
    'update_already_latest'    => 'Already up to date.',
    'update_success'           => 'Update successful! Database migrations will run on the next page load.',
    'update_progress_title'    => 'Performing Update',
    'update_progress_starting' => 'Starting update…',
    'update_redirect_in'       => 'Redirecting in',
    'update_unknown_error'     => 'Unknown error',
    'update_hints_title'       => 'Notes',
    'update_hint_backup'       => '⚠ Always back up your data/ folder before updating (database, uploads, avatars).',
    'update_hint_data'         => '✓ Your data in data/ will never be overwritten during an update.',
    'update_hint_migrations'   => '✓ Database migrations run automatically on the next page load.',
    'updates_enabled'          => 'Enable automatic update checks',
    'updates_enabled_hint'     => 'Disabling this prevents all outbound connections to plenvo.gp-server.com.',
    'updates_disabled_label'   => 'Update checks disabled',

    // System info
    'system_info'         => 'Software Update',
    'changelog_since'     => 'Changes in this update',
    'view_changelog'      => 'View changelog',
    'app_version_label'   => 'Installed Version',

    // External views
    'overview'                    => 'Overview',
    'send'                        => 'Send',
    'change_status'               => 'Change status',
    'no_tasks_assigned'           => 'No tasks assigned.',
    'ext_badge'                   => 'Ext.',
    'ext_comment_placeholder'     => 'Write a comment… – @ to mention',
    'due_label'                   => 'Due',
    'comment_empty_error'         => 'Comment must not be empty.',
    'comment_too_long'            => 'Comment too long (max. 5000 characters).',
    'ext_assign_greeting' => 'Hello :name,',
    'ext_assign_intro' => 'You have been assigned the task :task in project :project.',
    'ext_assign_link' => 'Show tasks →',
    'ext_assign_footer' => 'This link is personal and gives you access to your tasks in this project.',
    'ext_assign_subject' => 'Task assigned – :task',
    'app_default_language_label' => 'Default system language',
    'app_default_language_hint' => 'Used when neither the user\'s browser language nor their personal setting resolves to a supported language.',
    'domain_lang_title' => 'Domain language mapping',
    'domain_lang_desc' => 'External recipients receive emails in the language assigned to the domain of their email address.',
    'domain_lang_col_domain' => 'Domain',
    'domain_lang_col_language' => 'Language',
    'domain_lang_add_btn' => 'Save mapping',
    'domain_lang_empty' => 'No domain mappings configured yet.',
    'domain_lang_invalid_domain' => 'Invalid domain.',
    'domain_lang_invalid_language' => 'Invalid language.',
    'domain_lang_saved' => 'Domain mapping saved.',
    'domain_lang_save_failed' => 'Could not save domain mapping.',
    'domain_lang_deleted' => 'Domain mapping removed.',
    'contact_attachment_label' => 'File (optional)',
    'contact_attachment_hint' => 'Images or PDF, max. 10 MB.',
    'contact_err_attachment_type' => 'Only images (jpg, png, gif, webp) and PDF are allowed.',
    'contact_err_attachment_size' => 'File too large (max. 10 MB).',
    'contact_err_attachment_upload' => 'File upload failed.',
    'auto_update_title' => 'Scheduled automatic updates',
    'auto_update_desc' => 'When enabled, the cron installs available updates automatically inside the configured time window. Requires cron.php to run regularly (e.g. every 5–15 minutes) and updates to be allowed.',
    'auto_update_enabled' => 'Enable automatic updates',
    'auto_update_time_label' => 'Scheduled time (HH:MM, server time)',
    'auto_update_time_hint' => 'Updates run during the cron tick after this time, at most once per day.',
    'hc_migrations' => 'Database migrations',
    'hc_migrations_ok' => 'All migrations applied',
    'hc_migrations_pending' => ':n pending',
    'hc_migrations_failed' => 'Failed: :id (:error)',
    'hc_migrations_failed_generic' => 'Failed, see server log',
    'hc_app_version' => 'App version (code vs. DB)',
    'hc_app_version_ok' => 'Code and database in sync (:code)',
    'hc_app_version_mismatch' => 'Code version :code, DB version :db',
    'plugin_settings' => 'Settings',
    'hc_ldap_transport' => 'LDAP transport',
    'hc_ldap_inactive' => 'LDAP plugin not enabled',
    'hc_ldap_transport_ok' => ':mode active',
    'hc_ldap_transport_cleartext' => 'Cleartext LDAP transmits bind credentials and passwords in the clear',
    'hc_ldap_ca' => 'LDAP CA certificate',
    'hc_ldap_ca_none' => 'No CA certificate uploaded',
    'hc_ldap_ca_unknown' => 'CA stored, validity unknown',
    'hc_ldap_ca_expired' => 'CA certificate expired :days days ago',
    'hc_ldap_ca_soon' => 'CA certificate expires in :days days',
    'hc_ldap_ca_ok' => 'CA certificate valid (:days days left)',
    'hc_ldap_sync' => 'LDAP directory sync',
    'hc_ldap_sync_never' => 'Sync has not run yet',
    'hc_ldap_sync_ok' => 'Last run :h h ago',
    'hc_ldap_sync_warn' => 'Last run :h h ago (over 4 h)',
    'hc_ldap_sync_stale' => 'Last run :h h ago (over 24 h)',
    'bulk_selected' => 'selected',
    'bulk_set_status' => 'Set status',
    'bulk_set_priority' => 'Set priority',
    'bulk_set_assignees' => 'Set assignees',
    'bulk_set_due_date' => 'Set due date',
    'bulk_add_label' => 'Add label',
    'bulk_remove_label' => 'Remove label',
    'bulk_apply' => 'Apply',
    'bulk_clear' => 'Clear selection',
    'bulk_delete' => 'Delete',
    'bulk_confirm_delete' => 'Really delete :n tasks?',
    'external' => 'External',
    'clear' => 'Clear',
    'cmdk_placeholder' => 'Search projects, tasks or people…',
    'cmdk_empty' => 'No results',
    'cmdk_type_more' => 'Type at least 2 characters…',
    'cmdk_navigate' => 'navigate',
    'cmdk_open' => 'open',
    'shortcuts_title' => 'Keyboard shortcuts',
    'shortcuts_open_palette' => 'Open quick search',
    'shortcuts_navigate_results' => 'Navigate results',
    'shortcuts_open_result' => 'Open result',
    'shortcuts_close' => 'Close dialog',
    'shortcuts_hint' => 'Quick search finds projects and tasks you have access to. The shortcuts work from anywhere in Plenvo.',
    'cmdk_people' => 'People',
    'cmdk_open_tasks' => 'open',
    'managed_tasks_title' => 'Tasks in your projects',
    'managed_tasks_subtitle' => 'Open tasks for :name across projects where you are owner or manager.',
    'managed_tasks_empty' => 'No open tasks in your projects.',
    'plugin_impersonate_desc' => 'Lets administrators use the app as another user.',
    'plugin_provider_edition_desc' => 'Group-based user isolation, group creation requests and email invitations.',
    'plugin_ldap_desc' => 'Transparently authenticates Plenvo users against an LDAP/AD server. Supports LDAPS, StartTLS and (with a warning) cleartext. JIT provisioning, cron sync for deactivated directory users, optional admin group.',
    'plugin_oidc_desc' => 'Single Sign-On via OpenID Connect. Supports Keycloak, Google Workspace, Microsoft Entra ID and any other OIDC-compliant identity provider in parallel.',
    'plugin_gdpr_desc' => 'Fulfils the right of access under Art. 15 GDPR. Administrators can export a copy of a user\'s personal data; optionally, users may download their own data themselves.',
    'gdpr_settings_title' => 'GDPR Data Export',
    'gdpr_settings_saved' => 'GDPR settings saved.',
    'gdpr_admin_section' => 'Administrator export',
    'gdpr_admin_section_hint' => 'Open the user list at /admin/users — every row carries a "GDPR Export" button that produces a ZIP with that user\'s data. The export is generated on the fly and never stored on the server.',
    'gdpr_self_export_section' => 'Self-service export',
    'gdpr_self_export_enable' => 'Allow users to export their own data',
    'gdpr_self_export_enable_hint' => 'When enabled, every user gets a download card on the /settings page. Without this toggle, only administrators can produce GDPR exports.',
    'gdpr_cooldown_label' => 'Cooldown between self-exports (hours)',
    'gdpr_cooldown_hint' => 'A user may run a new self-export only after this many hours have passed since their last one. Prevents abuse of the endpoint.',
    'gdpr_attachments_section' => 'Attachments',
    'gdpr_include_attachments_label' => 'Include uploaded files in the ZIP',
    'gdpr_include_attachments_hint' => 'When enabled, files the user uploaded are bundled into the archive under attachments/. May produce large downloads.',
    'gdpr_intro_section' => 'README intro text',
    'gdpr_intro_label' => 'Operator-supplied introduction',
    'gdpr_intro_hint' => 'Free-text paragraph placed at the top of the README inside every export. Use it to name the controller, the data protection officer and the legal basis for processing.',
    'gdpr_intro_placeholder' => 'Controller: ACME GmbH, Example Street 1, 12345 City. Data protection officer: dpo@example.com. Legal basis: Art. 6(1)(b) GDPR (contract performance) and Art. 6(1)(f) (legitimate interest in tool operation).',
    'gdpr_err_cooldown_range' => 'Cooldown must be between 1 and 8760 hours.',
    'gdpr_err_intro_too_long' => 'Introduction text exceeds the limit of 4000 characters.',
    'gdpr_export_admin_btn' => 'GDPR Export',
    'gdpr_export_admin_btn_title' => 'Download a ZIP archive with this user\'s personal data (Art. 15 GDPR).',
    'gdpr_self_export_card_title' => 'Download your data (GDPR)',
    'gdpr_self_export_card_desc' => 'Receive a ZIP archive with a copy of the personal data this instance holds about you. The download is generated on the fly and never stored on the server.',
    'gdpr_self_export_btn' => 'Download my data',
    'gdpr_self_export_cooldown' => 'Available again in %d hour(s).',
    'gdpr_self_export_disabled' => 'Self-service export is currently disabled by the operator.',
    'gdpr_readme_heading' => 'GDPR data export — %s',
    'gdpr_readme_for' => 'For: %s <%s>',
    'gdpr_readme_generated' => 'Generated: %s',
    'gdpr_readme_trigger' => 'Triggered: %s',
    'gdpr_readme_triggered_admin' => 'by an administrator on your behalf',
    'gdpr_readme_triggered_self' => 'by yourself via the self-service page',
    'gdpr_readme_contents_heading' => 'Contents of this archive',
    'gdpr_readme_contents' => "Each JSON file inside this ZIP corresponds to one category of personal data:\n\n  profile.json           Account and preferences (without password hash, MFA secret, password reset tokens).\n  projects.json          Projects you own or are a member of.\n  tasks.json             Tasks you authored or that are assigned to you.\n  comments.json          Comments you wrote.\n  ai_messages.json       Messages you sent to the AI assistant (if the feature is in use).\n  notifications.json     Notifications addressed to you.\n  activity_log.json      Actions you performed (creation, update, status changes, etc.).\n  security_events.json   Security-relevant events for your account (logins, MFA, exports).\n  webauthn.json          Metadata of registered passkeys (no public-key bytes).\n  invitations.json       Invitations sent to your email address.\n  attachments.json       Metadata of files you uploaded.\n  group_memberships.json Group memberships (Provider Edition installations only).\n  attachments/           The actual uploaded files, only when the operator enabled this option.\n\nIntentionally NOT included: password hash, TOTP secret, MFA recovery codes, WebAuthn public-key bytes, encrypted email bodies, the transient mail queue. Including these would not benefit you and would weaken the security of your account.",
    'gdpr_readme_rights_heading' => 'Your rights under the GDPR',
    'gdpr_readme_rights' => "Beyond the right of access (Art. 15) which this export fulfils, you also have:\n\n  - Right to rectification (Art. 16): correct inaccurate data in your account settings.\n  - Right to erasure (Art. 17): delete your account from the settings page.\n  - Right to restriction of processing (Art. 18).\n  - Right to data portability (Art. 20): the JSON files in this archive are machine-readable.\n  - Right to object (Art. 21).\n  - Right to lodge a complaint with a supervisory authority (Art. 77).\n\nFor questions about how your data is processed, contact the controller named in the introduction above.",
    'oidc_settings_title' => 'OIDC / Single Sign-On',
    'oidc_settings_saved' => 'OIDC settings saved.',
    'oidc_global_section' => 'General',
    'oidc_enable' => 'Enable OIDC sign-in',
    'oidc_enable_hint' => 'When on, the login form shows a button for every configured and active provider.',
    'oidc_redirect_uri_label' => 'Redirect URI (whitelist this at the provider)',
    'oidc_redirect_uri_hint' => 'Register this URL at every provider as an allowed redirect URI. If the Plenvo URL changes, update it at the provider too.',
    'oidc_takeover_existing_users' => 'Take over existing local accounts on first successful OIDC sign-in',
    'oidc_takeover_existing_users_hint' => 'Off: users with a local password cannot sign in via OIDC. On: the local account is converted to OIDC on first sign-in, the local password becomes unusable.',
    'oidc_add_provider' => 'Add provider',
    'oidc_kind' => 'Provider kind',
    'oidc_kind_keycloak' => 'Keycloak',
    'oidc_kind_google' => 'Google Workspace',
    'oidc_kind_microsoft' => 'Microsoft Entra ID',
    'oidc_kind_custom' => 'Custom OIDC provider',
    'oidc_kind_input_label' => 'Quick setup',
    'oidc_kind_input_hint' => 'Keycloak: realm URL (e.g. https://keycloak.example.com/realms/plenvo). Microsoft: tenant id. Google: leave empty.',
    'oidc_provider_id' => 'Internal id',
    'oidc_provider_id_hint' => 'Lowercase letters, digits, _ and - only. Used in the URL and internally; not changeable later.',
    'oidc_provider_label' => 'Display name',
    'oidc_provider_enabled' => 'Enable this provider',
    'oidc_discovery_url' => 'Discovery URL',
    'oidc_discovery_url_hint' => 'Optional: auto-filled from the quick-setup field. Must end in /.well-known/openid-configuration.',
    'oidc_client_id' => 'Client ID',
    'oidc_client_secret' => 'Client secret',
    'oidc_secret_set_keep' => 'Existing secret kept — leave empty.',
    'oidc_scopes' => 'Scopes',
    'oidc_optional' => '(optional)',
    'oidc_refresh_discovery' => 'Refresh discovery',
    'oidc_or_continue_with' => 'Or sign in with',
    'oidc_sign_in_with' => 'Sign in with',
    'oidc_err_unavailable' => 'OIDC sign-in is currently not available.',
    'oidc_err_session' => 'Sign-in expired, please try again.',
    'oidc_err_state' => 'Sign-in security check failed.',
    'oidc_err_discovery' => 'Provider unreachable or misconfigured.',
    'oidc_err_token' => 'Sign-in failed, please try again.',
    'oidc_err_locked' => 'Account locked or takeover not allowed.',
    'oidc_err_generic' => 'Sign-in failed.',
    'oidc_err_invalid_id' => 'Internal id may only contain a-z, 0-9, underscore and hyphen.',
    'oidc_err_id_taken' => 'That internal id is already in use.',
    'oidc_err_invalid_discovery' => 'Discovery URL must use HTTPS and end in /.well-known/openid-configuration. Plain http:// is only allowed for localhost.',
    'oidc_err_client_id_required' => 'Client ID is required.',
    'oidc_err_secret_required' => 'Client secret is required.',
    'oidc_err_unknown_provider' => 'Provider not found.',
    'inactive_cleanup_title' => 'Auto-delete inactive accounts',
    'nav_inactive_cleanup' => 'Inactive accounts',
    'inactive_cleanup_excluded_label' => 'Never affected',
    'inactive_cleanup_excluded_hint' => 'Administrator accounts and accounts managed via LDAP / Active Directory. Their lifecycle is controlled by the directory.',
    'scope_mine' => 'My tasks',
    'scope_all_my_projects' => 'All in my projects',
    'assigned_filter_me' => 'Assigned to me',
    'assigned_filter_others' => 'Other people',
    'assigned_filter_externals' => 'External participants',
    'assigned_filter_none' => 'Unassigned',
    'assigned_filter_anyone' => 'Anyone',
    'clear_filters' => 'Clear filters',
    'clear_filters_hint' => 'Drop all filters and show everything you have access to.',
    'inactive_cleanup_desc' => 'Users who have not logged in for the configured period first receive a warning email. If the user does not log in during the grace period, the account is permanently deleted. Admin accounts are excluded. Projects where the user is the only owner are deleted along with the account.',
    'inactive_cleanup_enable_label' => 'Enable',
    'inactive_cleanup_threshold_label' => 'Inactivity (months)',
    'inactive_cleanup_threshold_hint' => 'Default 12. Between 1 and 120.',
    'inactive_cleanup_warning_label' => 'Grace period (days)',
    'inactive_cleanup_warning_hint' => 'Default 14. Between 1 and 90.',
    'inactive_cleanup_last_run' => 'Last run :when — :warned warned, :deleted deleted.',
    'mail_inactive_warning_subject' => 'Your account will be deleted in :days days',
    'mail_inactive_warning_body' => 'Your account has been inactive for a long time. If you do not log in within :days days, the account and any sole-owner projects will be permanently deleted.',
    'mail_inactive_warning_cta' => 'Log in now',
    'mail_inactive_warning_footer' => 'This is an automated email from Plenvo. A single successful login is enough to cancel the deletion.',
    'ldap_settings_title' => 'LDAP / Active Directory',
    'ldap_settings_saved' => 'LDAP settings saved.',
    'ldap_extension_missing' => 'PHP extension "ldap" is not loaded. The plugin cannot authenticate until the extension is installed and PHP-FPM is restarted.',
    'ldap_section_general' => 'Connection',
    'ldap_section_service_account' => 'Service account',
    'ldap_section_filters' => 'Filters and attribute mapping',
    'ldap_section_behaviour' => 'Behaviour',
    'ldap_section_ca' => 'CA certificate',
    'ldap_section_test' => 'Test connection',
    'ldap_section_sync' => 'Directory sync',
    'ldap_enable' => 'Enable LDAP authentication',
    'ldap_enable_hint' => 'When enabled, login attempts are checked against the directory first. Local accounts continue to work.',
    'ldap_transport' => 'Transport',
    'ldap_transport_ldaps' => 'LDAPS (TLS on port 636) – recommended',
    'ldap_transport_starttls' => 'LDAP + StartTLS (port 389)',
    'ldap_transport_cleartext' => 'LDAP cleartext – not recommended',
    'ldap_transport_hint' => 'LDAPS or StartTLS encrypts bind credentials and user passwords on the wire. Cleartext sends them in the open.',
    'ldap_cleartext_ack' => 'I accept the risks of running LDAP without encryption.',
    'ldap_cleartext_ack_hint' => 'Required acknowledgement when you select cleartext. The health-check still reports the state as a security issue, but the email-alert pipeline stays silent.',
    'ldap_cleartext_must_ack' => 'Cleartext transport requires the explicit acknowledgement checkbox.',
    'ldap_invalid_transport' => 'Invalid transport mode.',
    'ldap_invalid_port' => 'Port must be between 1 and 65535.',
    'ldap_host' => 'Host',
    'ldap_port' => 'Port',
    'ldap_base_dn' => 'Base DN',
    'ldap_bind_dn' => 'Bind DN',
    'ldap_bind_dn_hint' => 'Service account used to search for users. Leave empty for anonymous bind.',
    'ldap_bind_password' => 'Bind password',
    'ldap_bind_password_hint' => 'Stored encrypted with AES-256-GCM in the database.',
    'ldap_bind_password_set_keep' => 'Existing password kept – leave empty.',
    'ldap_user_filter' => 'User filter',
    'ldap_user_filter_hint' => 'LDAP filter used to find a user by email. "%s" is replaced with the LDAP-escaped email. Example: (mail=%s) or (userPrincipalName=%s).',
    'ldap_user_filter_needs_placeholder' => 'User filter must contain "%s" as the email placeholder.',
    'ldap_active_filter' => 'Activity filter',
    'ldap_active_filter_hint' => 'Optional additional filter that excludes disabled or locked directory users. AD example: (!(userAccountControl:1.2.840.113556.1.4.803:=2))',
    'ldap_attr_username' => 'Username attribute',
    'ldap_attr_email' => 'Email attribute',
    'ldap_attr_groups' => 'Group attribute',
    'ldap_admin_group_dn' => 'Admin group (DN)',
    'ldap_admin_group_dn_hint' => 'Members of this group get the Plenvo role "admin" on every login. Users who lose membership fall back to "user".',
    'ldap_required_group_dn' => 'Required group (DN)',
    'ldap_required_group_dn_hint' => 'Optional: only members of this group are allowed to sign in. Leave empty to disable this restriction.',
    'ldap_tls_require_cert' => 'TLS certificate validation',
    'ldap_tls_require_demand' => 'demand – certificate required and valid (recommended)',
    'ldap_tls_require_try' => 'try – validate, continue on failure',
    'ldap_tls_require_allow' => 'allow – ignore validation errors',
    'ldap_tls_require_never' => 'never – no validation',
    'ldap_tls_require_hint' => 'Self-signed certificates only work with an uploaded CA certificate or with "allow"/"never". The latter open up MITM attacks.',
    'ldap_takeover_existing_users' => 'Take over existing local accounts on first successful LDAP bind',
    'ldap_takeover_existing_users_hint' => 'Off: users with a local account cannot sign in via LDAP; the local password stays active. On: the account is converted to LDAP on first LDAP login; the local password becomes unusable.',
    'ldap_ca_active' => 'Active CA certificate',
    'ldap_ca_valid_until' => 'Valid until:',
    'ldap_ca_remove' => 'Remove CA',
    'ldap_ca_none_hint' => 'If the LDAP server uses a custom or internal certificate that the system CA bundle does not know, upload the CA certificate here in PEM format.',
    'ldap_ca_upload' => 'CA certificate (PEM)',
    'ldap_ca_upload_hint' => 'Up to 32 KB. Allowed extensions: .pem, .crt, .cer.',
    'ldap_ca_upload_btn' => 'Upload CA',
    'ldap_ca_upload_missing' => 'No valid file upload.',
    'ldap_ca_too_large' => 'File too large (32 KB max).',
    'ldap_ca_not_pem' => 'File is not a parsable PEM certificate.',
    'ldap_ca_expired' => 'Certificate has already expired.',
    'ldap_ca_write_failed' => 'Could not write file – check permissions.',
    'ldap_test_hint' => 'Only probes the service-account bind. User passwords are not touched.',
    'ldap_test_run' => 'Run test',
    'ldap_test_not_configured' => 'LDAP is not yet sufficiently configured (host, base DN).',
    'ldap_test_connect_failed' => 'Connection or TLS handshake failed.',
    'ldap_test_anonymous_ok' => 'Anonymous bind succeeded. (No bind DN configured.)',
    'ldap_test_bind_ok' => 'Service account bind succeeded.',
    'ldap_test_bind_failed' => 'Service account bind failed – check DN or password.',
    'ldap_sync_last_run' => 'Last sync',
    'ldap_sync_stats' => 'Checked: :n, disabled: :d',
    'ldap_sync_never' => 'Sync has never run.',
    'ldap_sync_run_now' => 'Sync now',
    'ldap_sync_done' => 'Sync complete: :n checked, :d disabled.',
    'ldap_sync_failed' => 'Sync failed (:reason).',
    'mail_greeting' => 'Hello :name,',
    'mail_open_task' => 'Open task →',
    'mail_show_tasks' => 'Show tasks →',
    'mail_view_task' => 'View task',
    'mail_view_comment' => 'View comment →',
    'mail_personal_link' => 'This link is personal and gives you access to your tasks in this project.',
    'mail_project_label' => 'Project: :name',
    'mail_assigned_subject' => 'Task assigned – :task',
    'mail_assigned_body' => 'You have been assigned the task :task in project :project.',
    'mail_mgr_activity_subject' => 'Activity – :project',
    'mail_mgr_activity_body' => 'Activity in project :project: :actor – :action. Task: :task',
    'mail_activity_inapp' => 'Activity: :task',
    'mail_task_done_subject' => 'Task completed – :task',
    'mail_task_done_intro' => 'The following task has been completed:',
    'mail_task_done_by' => 'Completed by: :actor',
    'mail_task_done_inapp' => 'By: :actor | Project: :project',
    'mail_predec_subject' => 'Task can be started – :task',
    'mail_predec_intro' => 'All predecessor tasks of :task in project :project are now completed.',
    'mail_predec_cta' => 'You can now begin your task.',
    'mail_predec_inapp' => 'All predecessors completed | Project: :project',
    'mail_reminder_subject' => 'Reminder – :task',
    'mail_reminder_3days_body' => 'Reminder: The task :task in project :project is due in 3 days.',
    'mail_reminder_3days_inapp' => 'Due in 3 days: :task',
    'mail_comment_subject' => 'New comment – :task',
    'mail_comment_body_internal' => ':actor commented on the task :task in project :project.',
    'mail_comment_body_external' => 'The task :task in project :project has been commented on.',
    'mail_comment_inapp' => 'By: :actor | Project: :project',
    'mail_change_subject' => 'Task changed – :task',
    'mail_change_body' => 'The task :task in project :project has been changed.',
    'mail_unassign_subject' => 'Removed from task – :task',
    'mail_unassign_body' => 'You have been removed from the task :task in project :project.',
    'mail_attachment_subject' => 'New attachment – :task',
    'mail_attachment_body' => 'A new attachment was uploaded to the task :task in project :project.',
    'mail_task_created_subject' => 'New task – :task',
    'mail_task_created_intro' => 'A new task was created in project :project:',
    'mail_created_by' => 'Created by: :actor',
    'mail_task_created_inapp' => 'Created by: :actor | Project: :project',
    'mail_mention_subject' => 'You were mentioned – :task',
    'mail_mention_body_internal' => ':actor mentioned you in a comment on the task :task in project :project.',
    'mail_mention_body_external' => 'You were mentioned in a comment on the task :task in project :project.',
    'mail_mention_inapp' => 'By: :actor | Project: :project',
    'mail_dueday_subject' => 'Due today – :task',
    'mail_dueday_body' => 'Reminder: The task :task in project :project is due today.',
    'mail_overdue_subject' => 'Overdue task – :task',
    'mail_overdue_intro' => 'The following task is overdue:',
    'mail_overdue_due_was' => 'Was due: :date',
    'mail_overdue_inapp' => 'Was due: :date | Project: :project',
    'mail_startdate_subject' => 'Task can be started – :task',
    'mail_startdate_body' => 'The task :task in project :project starts today. You can begin now.',
    'mail_startdate_due_info' => 'Due: :date.',
    'mail_task_event_body' => ':actor :action:',
    'mail_admin_group_request_subject' => 'Group request from :user',
    'mail_admin_group_request_intro' => 'A user is requesting permission to create their own groups:',
    'mail_admin_label_username' => 'Username',
    'mail_admin_label_email' => 'Email',
    'mail_admin_label_time' => 'Time',
    'mail_admin_manage_requests' => 'Manage requests →',
    'mail_admin_new_reg_subject' => 'New registration – :user',
    'mail_admin_new_reg_intro' => 'A new user has registered and is awaiting email verification:',
    'mail_admin_open_users' => 'Open user management →',
    'mail_admin_new_reg_inapp' => 'New registration: :user',
    'security_log_title' => 'Security log',
    'security_log_desc' => 'Security-relevant events (logins, MFA, admin actions, plugin/update operations). Retention: :days days. Showing the latest 500 entries.',
    'security_log_filter_type' => 'Event type',
    'security_log_filter_severity' => 'Severity',
    'security_log_filter_all' => 'All',
    'security_log_empty' => 'No security events recorded yet.',
    'security_log_col_time' => 'Time',
    'security_log_col_severity' => 'Level',
    'security_log_col_type' => 'Type',
    'security_log_col_user' => 'User',
    'security_log_col_ip' => 'IP',
    'security_log_col_details' => 'Details',
    'security_log_filter_placeholder' => 'Filter…',
    'security_log_filter_no_match' => 'No entries match the current filters.',
    'security_log_max_rows' => 'Display capped at 500 entries. Older entries are pruned automatically according to the retention setting.',
    'security_log_deleted_user' => 'deleted',
    'sec_seclog_title' => 'Security event log',
    'sec_seclog_retention' => 'Retention (days)',
    'sec_seclog_retention_hint' => 'Days before security events are pruned automatically. 0 = keep forever.',
    'apply' => 'Apply',
    'reset' => 'Reset',
    'mail_footer_auto_generated' => 'This email was generated automatically',
    'update_available_notif_title' => 'Plenvo :version available',
    'update_available_notif_msg' => 'A new version is available. Update now in system settings.',
    'plugin_activated_msg' => 'Plugin activated.',
    'plugin_deactivated_msg' => 'Plugin deactivated.',
    'preferences_saved_msg' => 'Preferences saved.',
    'project_status_added' => 'Status added',
    'project_status_deleted' => 'Status deleted',
    'project_label_added' => 'Label added',
    'project_label_deleted' => 'Label deleted',
    'ai_request_failed' => 'AI request failed. Please try again.',
    'contact_admin_mail_title' => 'New contact request',
    'contact_admin_mail_footer' => 'Sent from IP :ip on :time',
    'notify_admins_new_registration_label' => 'Notify admins about new registrations',
    'notify_admins_new_registration_hint' => 'When active, admins receive an email and in-app notification as soon as a user registers (before email verification).',
    'unverified_user_max_hours_label' => 'Delete unverified accounts after (hours)',
    'unverified_user_max_hours_hint' => 'Accounts that have not confirmed their email within this period after registration are removed automatically by the cron. 0 = never delete.',
    'timezone_label' => 'Timezone',
    'timezone_user_hint' => 'Leave empty to use the installation\'s default timezone.',
    'timezone_inherit_default' => '— System default —',
    'app_default_timezone_label' => 'Default timezone',
    'app_default_timezone_hint' => 'Used when a user has not set their own timezone. Affects date/time display in emails and in the UI.',
    'save_all_btn' => 'Save all settings',
    'save_all_in_progress' => 'Saving…',
    'save_all_success' => 'All settings saved',
    'save_all_failed' => 'Save failed — reload and try again',
    'toast_click_to_copy' => 'Click to copy',
    'toast_copied' => 'Copied to clipboard ✓',
    'toast_close' => 'Close',
    'hc_cron_title' => 'Health Check as cron monitor',
    'hc_cron_desc' => 'When enabled, the cron runs all health checks at the configured interval. An email is sent when a state worsens (OK → warn/error or warn → error). Each problem is reported only once until it improves or is resolved.',
    'hc_cron_enable_label' => 'Enable cron monitor',
    'hc_cron_interval_label' => 'Interval (minutes)',
    'hc_cron_interval_hint' => 'Minimum 5, maximum 1440 minutes (24h).',
    'hc_cron_alert_email_label' => 'Alert email address(es)',
    'hc_cron_alert_email_hint' => 'Comma- or space-separated. Empty = all active admins.',
    'topbar_health_ok' => 'System healthy',
    'topbar_health_warn' => 'System: warnings',
    'topbar_health_error' => 'System: errors',
    'topbar_health_unknown' => 'System status unknown — cron monitor has not run yet',
    'mail_hc_alert_subject' => 'Health Check alert — :n issue(s)',
    'mail_hc_alert_intro' => 'The latest cron check detected new issues:',
    'mail_hc_resolved_subject' => 'Health Check — :n issue(s) resolved',
    'mail_hc_resolved_intro' => 'The following previously reported issues are now resolved:',
    'mail_hc_at' => 'Checked at :time',
    'hc_paths' => 'Sensitive paths',
    'hc_paths_ok' => ':n paths not publicly reachable',
    'hc_paths_exposed' => 'Publicly reachable: :list',
    'hc_key_perms' => 'Key file permissions',
    'hc_key_missing' => 'data/app.key does not exist yet (created on first encrypt)',
    'hc_key_ok' => '0600 (owner only)',
    'hc_key_bad' => 'data/app.key has permissions :perms — should be 0600',
    'hc_db_perms' => 'DB file permissions',
    'hc_db_missing' => 'data/database.sqlite does not exist',
    'hc_db_ok' => ':perms (not world-readable)',
    'hc_db_world_readable' => 'data/database.sqlite is world-readable (:perms) — data theft possible',
    'hc_https' => 'HTTPS enforced',
    'hc_https_not_https' => 'app_url is :url — should start with https://',
    'hc_https_http_open' => 'http:// returns 200 instead of redirect/block — credentials may travel unencrypted',
    'hc_https_ok' => 'app_url uses https and http:// blocks/redirects',
    'hc_admin_mfa' => 'Admin accounts with 2FA',
    'hc_admin_mfa_ok' => 'All active admins have at least one second factor',
    'hc_admin_mfa_missing' => ':n admin(s) without TOTP/email-MFA/WebAuthn',
    'hc_admin_mfa_check_failed' => 'Check failed',
    'hc_php_config' => 'PHP configuration',
    'hc_php_config_ok' => 'PHP :v — display_errors/expose_php off, session cookies HttpOnly',
    'hc_php_config_issues' => 'Recommended values violated: :list',
    'hc_php_config_cli_skip' => 'PHP :v — values checked against the web SAPI only (cron run skipped)',
    'hc_mail_heartbeat' => 'Mail send heartbeat',
    'hc_mail_heartbeat_disabled' => 'Notifications are disabled',
    'hc_mail_heartbeat_unconfigured' => 'No mail provider configured',
    'hc_mail_heartbeat_never' => 'No successful send recorded yet',
    'hc_mail_heartbeat_ok' => 'Last successful send :h hour(s) ago',
    'hc_mail_heartbeat_stale' => 'Last successful send :d days ago — check SMTP/provider',
    'hc_disk' => 'Free disk space',
    'hc_disk_unknown' => 'Could not determine free space',
    'hc_disk_ok' => ':gb GB free',
    'hc_disk_low' => 'Only :gb GB free (threshold 15 GB) — uploads/backups at risk',
    'dl_bsi_hint' => 'Code-level security & BSI compliance report:',

    // Backup & Restore
    'backup_title' => 'Backup & Restore',
    'backup_intro' => 'Download a complete ZIP of the database, encryption key, avatars and attachments, or restore from an existing backup file.',
    'backup_download_title' => 'Create backup',
    'backup_download_desc' => 'The ZIP contains the database, the AES key (TOTP secrets, LDAP bind password), all avatars and task attachments, and the plugin state.',
    'backup_download_btn' => 'Create and download backup',
    'backup_create_btn' => 'Create backup',
    'backup_create_ok' => 'Backup created: :filename — visible in the "Existing backups" list.',
    'backup_passphrase_optional' => 'Passphrase (optional, recommended)',
    'backup_passphrase_placeholder' => 'At least 12 characters',
    'backup_passphrase_hint' => 'If set, the ZIP is encrypted with AES-256-GCM (PBKDF2-SHA256). Without a passphrase the file is as sensitive as the instance itself and should be stored only in a protected location.',
    'backup_passphrase_if_encrypted' => 'Passphrase (only for encrypted backups)',
    'backup_restore_title' => 'Restore backup',
    'backup_restore_warn' => 'Warning: restoring replaces the current database, avatars and attachments entirely. The previous payload is archived in `data/.restore-backup-<timestamp>/`. You will be logged out and must sign in again with the credentials stored in the backup.',
    'backup_restore_two_step_hint' => 'Restore is a two-step flow: the backup is validated first. The next page shows the source version, contents and the app URL stored in the backup — you can adopt or change it before the restore is applied.',
    'backup_restore_validate_btn' => 'Validate backup',
    'backup_restore_confirm' => 'Really restore this backup? Current data will be replaced.',
    'backup_restore_file' => 'Backup file',
    'backup_restore_file_hint' => '.zip or .zip.enc, created by this Plenvo version or an older one.',
    'backup_restore_btn' => 'Restore backup',
    'backup_restore_success' => 'Backup restored. Please sign in again.',
    'backup_review_title' => 'Review and apply backup',
    'backup_review_summary' => 'Backup contents',
    'backup_review_intro' => 'The uploaded backup has been validated but not yet applied. Review the details below and adjust the app URL if necessary before confirming.',
    'backup_review_source_version' => 'Source version',
    'backup_review_source_app_name' => 'Application name in the backup',
    'backup_review_created' => 'Created at',
    'backup_review_encrypted' => 'Encrypted?',
    'backup_review_yes' => 'Yes',
    'backup_review_no' => 'No',
    'backup_review_counts' => 'Contents',
    'backup_review_target_url' => 'App URL after restore',
    'backup_review_target_url_intro' => 'The backup contains an app URL. On restore, `settings.app_url` is overwritten with exactly the value in this field — change it if this instance runs under a different domain than the source.',
    'backup_review_app_url_label' => 'App URL',
    'backup_review_app_url_hint' => 'Full URL with scheme (https://). Leave empty to auto-detect from the Host header.',
    'backup_review_url_change_warn' => 'Important: if you change the URL relative to the backup, WebAuthn credentials (bound to the old domain) and OIDC provider configurations (redirect URIs) may need manual updates at the identity providers.',
    'backup_review_apply_confirm' => 'Apply this backup now? Current data will be replaced and you will be logged out.',
    'backup_review_apply_btn' => 'Apply backup now',
    'backup_review_cancel_btn' => 'Cancel and discard backup',
    'backup_cancel_success' => 'Backup discarded.',
    'backup_err_invalid_token' => 'Invalid backup token. Please re-upload.',
    'backup_err_staging_expired' => 'Staged backup expired or was discarded. Please re-upload.',
    'backup_err_url_invalid' => 'App URL must start with http:// or https:// and include a hostname.',
    'backup_err_dotfile' => 'Backup contains hidden files (dotfiles) that could overwrite configuration files on the target instance.',
    'backup_err_in_progress' => 'Another restore is currently running. Please wait briefly and try again.',
    'backup_err_persist' => 'Backup could not be saved to the backup directory.',
    'backup_err_unknown_backup' => 'Backup file not found.',
    'backup_existing_title' => 'Existing backups',
    'backup_existing_intro' => 'Backups are stored under `data/backups/` and can be downloaded, restored or deleted from here.',
    'backup_existing_empty' => 'No backups available. Create one with the button above.',
    'backup_col_filename' => 'Filename',
    'backup_col_created' => 'Created',
    'backup_col_size' => 'Size',
    'backup_col_encrypted' => 'Encrypted',
    'backup_col_actions' => 'Actions',
    'backup_action_download' => 'Download',
    'backup_action_restore' => 'Restore',
    'backup_action_delete' => 'Delete',
    'backup_action_delete_confirm' => 'Permanently delete this backup file?',
    'backup_passphrase_short' => 'Passphrase',
    'backup_delete_ok' => 'Backup file deleted.',
    'backup_retention_title' => 'Retention',
    'backup_retention_label' => 'Delete backups after (days)',
    'backup_retention_hint' => '0 = never auto-delete. The cron run removes backups older than the configured number of days once per day.',
    'backup_default_passphrase_title' => 'Default passphrase',
    'backup_default_passphrase_intro' => 'When set, every new backup is automatically encrypted with this passphrase — you do not have to re-enter it on creation or restore. Status:',
    'backup_default_passphrase_state_set' => 'set',
    'backup_default_passphrase_state_unset' => 'not set',
    'backup_default_passphrase_label' => 'New default passphrase',
    'backup_default_passphrase_hint' => 'At least 12 characters. Stored AES-256-GCM-encrypted in the settings table. Leave empty to keep the existing default passphrase unchanged.',
    'backup_default_passphrase_clear_btn' => 'Remove default passphrase',
    'backup_default_passphrase_rotation_note' => 'Note: if you replace or remove this passphrase, existing backups can only be restored by manually entering the OLD passphrase in the restore dialog. Keep the old passphrase as long as you might still want to restore them.',
    'backup_default_passphrase_clear_confirm' => 'Really remove the default passphrase? New backups will be unencrypted. Existing backups encrypted with this passphrase can only be restored by manually entering the OLD passphrase — keep it as long as you might still want to restore old backups.',
    'backup_passphrase_uses_default_hint' => 'A default passphrase is configured — leaving this field empty will use it.',
    'backup_save_as_default_btn' => 'Save as default',
    'backup_save_as_default_hint' => 'Stores the passphrase entered above as the default without creating a backup.',
    'backup_save_as_default_confirm' => 'Save this passphrase as the default for all future backups?',
    'backup_default_passphrase_badge' => 'Default passphrase active',
    'backup_default_passphrase_active_hint' => 'A default passphrase is configured and will be used automatically whenever no passphrase is provided on backup creation or restore.',
    'backup_default_passphrase_active_inline' => 'Default set',
    'backup_download_uses_default_hint' => 'The backup is automatically encrypted with the default passphrase set above.',
    'backup_download_unencrypted_warning' => 'Note: no default passphrase is set — the backup will be created unencrypted. Set a passphrase above to protect backup files.',
    'backup_auto_title' => 'Automatic backups',
    'backup_auto_intro' => 'Let Plenvo create backups regularly via cron. It uses the default passphrase set above (or creates an unencrypted backup if none is set). Cleanup of old auto-backups is handled by the retention setting further below.',
    'backup_auto_enable' => 'Enable automatic backups',
    'backup_auto_frequency_label' => 'Frequency',
    'backup_auto_freq_daily' => 'Daily',
    'backup_auto_freq_weekly' => 'Weekly',
    'backup_auto_freq_monthly' => 'Monthly',
    'backup_auto_time_label' => 'Time (slot)',
    'backup_auto_time_hint' => 'Cron may run up to 240 minutes after the slot.',
    'backup_auto_weekday_label' => 'Weekday',
    'backup_auto_dom_label' => 'Day of month',
    'backup_auto_dom_hint' => '1–28 (no 29/30/31 — avoids February issues).',
    'backup_auto_last_run' => 'Last auto-backup run',
    'backup_auto_last_error' => 'Last error',
    'day_sun' => 'Sunday',
    'day_mon' => 'Monday',
    'day_tue' => 'Tuesday',
    'day_wed' => 'Wednesday',
    'day_thu' => 'Thursday',
    'day_fri' => 'Friday',
    'day_sat' => 'Saturday',
    'backup_passphrase_too_short' => 'Default passphrase must be at least 12 characters long.',
    'backup_passphrase_saved_ok' => 'Default passphrase saved.',
    'backup_passphrase_cleared_ok' => 'Default passphrase removed.',
    'backup_err_generic' => 'Backup operation failed.',
    'backup_err_no_zip_ext' => 'PHP extension "zip" is required.',
    'backup_err_tmp' => 'Temporary file could not be created.',
    'backup_err_snapshot' => 'Database snapshot failed.',
    'backup_err_zip_open' => 'ZIP archive could not be opened.',
    'backup_err_encrypt' => 'Encrypting the backup failed.',
    'backup_err_decrypt' => 'Decryption failed — wrong passphrase or corrupted file.',
    'backup_err_pass_required' => 'This file is encrypted — please provide the passphrase.',
    'backup_err_invalid_zip' => 'File is not a valid ZIP archive.',
    'backup_err_invalid_manifest' => 'Manifest is missing or has an unknown format.',
    'backup_err_newer_version' => 'Backup originates from a newer Plenvo version. Please update the application first.',
    'backup_err_missing_db' => 'Backup does not contain database.sqlite.',
    'backup_err_path_traversal' => 'Backup contains invalid path entries.',
    'backup_err_unknown_path' => 'Backup contains files in an unexpected location.',
    'backup_err_backup_dir' => 'Could not create the rollback directory.',
    'backup_err_extract' => 'Extracting the backup failed — previous state has been restored.',
    'backup_err_upload' => 'File upload failed.',
    'backup_err_too_large' => 'File too large (limit 512 MB).',
    'backup_err_default_passphrase_unreadable' => 'The configured default passphrase could not be decrypted — likely the app.key was rotated in the meantime. Operation aborted to avoid producing an unintentionally unencrypted backup. Reset or remove the default passphrase.',

    // ── Scheduling polls (meetingpoll plugin) ───────────────────────────────
    'mp_plugin_desc'        => 'Multi-option scheduling polls: propose several date/time options, share a link, participants vote without logging in.',
    'mp_nav'                => 'Scheduling polls',
    'mp_new_poll'           => 'New scheduling poll',
    'mp_list_intro'         => 'Propose several dates and share the link – participants vote without an account.',
    'mp_no_polls'           => 'You have not created any scheduling polls yet.',
    'mp_col_title'          => 'Title',
    'mp_col_options'        => 'Options',
    'mp_col_responses'      => 'Responses',
    'mp_col_status'         => 'Status',
    'mp_status_open'        => 'Open',
    'mp_status_closed'      => 'Closed',
    'mp_status_finalized'   => 'Finalized',
    'mp_create_title'       => 'Create scheduling poll',
    'mp_edit_title'         => 'Edit scheduling poll',
    'mp_field_title'        => 'Title',
    'mp_field_title_ph'     => 'e.g. Team meeting in May',
    'mp_field_desc'         => 'Description',
    'mp_field_desc_ph'      => 'What is this about? (optional)',
    'mp_field_location'     => 'Location',
    'mp_field_location_ph'  => 'e.g. Meeting room 2 or video call (optional)',
    'mp_field_deadline'     => 'Deadline',
    'mp_field_deadline_hint'=> 'After this point no more responses are accepted (optional).',
    'mp_field_options'      => 'Date/time options',
    'mp_opt_date'           => 'Date',
    'mp_opt_start'          => 'From',
    'mp_opt_end'            => 'To',
    'mp_add_option'         => 'Add option',
    'mp_cal_hint'           => 'Click the days in the calendar you want to offer as date options. Clicking a day again removes it.',
    'mp_no_dates'           => 'No days selected yet.',
    'mp_cal_nojs'           => 'JavaScript is required to pick dates.',
    'mp_default_time'       => 'Default time for new days:',
    'mp_duration'           => 'Duration:',
    'mp_dur_none'           => 'No end time',
    'mp_apply_to_all'       => 'Apply to all',
    'mp_edit_time'          => 'Change time',
    'mp_invite_title'       => 'Invite participants',
    'mp_invite_hint'        => 'Invite Plenvo users via search or enter external email addresses. Everyone receives the poll link by email.',
    'mp_invite_users_label' => 'Plenvo users',
    'mp_invite_search_ph'   => 'Search by name or email …',
    'mp_invite_emails_label'=> 'External email addresses',
    'mp_invite_emails_ph'   => 'max@example.com, anna@example.com … (comma- or newline-separated)',
    'mp_invite_send'        => 'Send invitations',
    'mp_invited_people'     => 'Invited',
    'mp_invite_pending'     => 'Pending',
    'mp_invite_responded'   => 'Responded',
    'mp_invite_resend'      => 'Resend',
    'mp_invite_remove'      => 'Remove from list',
    'mp_invite_remove_confirm' => 'Remove this invitation from the list?',
    'mp_invite_sent'        => ':count invitation(s) sent.',
    'mp_invite_resent'      => 'Invitation re-sent.',
    'mp_invite_removed'     => 'Invitation removed.',
    'mp_invite_recently_sent' => 'This invitation was just sent. Please wait a moment.',
    'mp_mail_invite_subject'=> 'Invitation to a scheduling poll: :title',
    'mp_mail_invite_body'   => 'You have been invited to vote in the scheduling poll ":title". Please pick the dates that work for you:',
    'mp_opt_hint'           => 'Leave the time empty for an all-day option. At least one option is required.',
    'mp_field_allow_maybe'  => 'Allow an "if need be" option (participants can pick "maybe")',
    'mp_field_hide_results' => 'Hidden poll: participants cannot see each other\'s responses',
    'mp_field_notify_owner' => 'Email me on every new response',
    'mp_create_submit'      => 'Create poll',
    'mp_created'            => 'Scheduling poll created.',
    'mp_saved'              => 'Changes saved.',
    'mp_deleted'            => 'Scheduling poll deleted.',
    'mp_confirm_delete_poll'    => 'Really delete this scheduling poll and all responses?',
    'mp_confirm_delete_response'=> 'Really delete this response?',
    'mp_delete_response'    => 'Delete response',
    'mp_response_deleted'   => 'Response deleted.',
    'mp_share_link'         => 'Share link',
    'mp_copy_link'          => 'Copy link',
    'mp_copied'             => 'Copied!',
    'mp_open_link'          => 'Open',
    'mp_share_hint'         => 'Share this link with all participants – no account required.',
    'mp_manage_poll'        => 'Manage poll',
    'mp_meta_responses'     => ':count response(s)',
    'mp_meta_deadline'      => 'Deadline: :date',
    'mp_meta_hidden'        => 'Hidden poll',
    'mp_deadline_passed'    => 'The deadline passed on :date – no further responses are possible.',
    'mp_voting_closed'      => 'This poll is closed – voting is no longer possible.',
    'mp_no_options_yet'     => 'No date/time options have been added to this poll yet.',
    'mp_participant'        => 'Participant',
    'mp_all_day'            => 'all day',
    'mp_no_responses'       => 'No responses yet.',
    'mp_total'              => 'Total',
    'mp_results'            => 'Results',
    'mp_finalize_title'     => 'Finalize the date',
    'mp_finalize_hint'      => 'Pick the final date. You can undo this later.',
    'mp_finalize_choose'    => 'Choose a date …',
    'mp_finalize_notify'    => 'Notify participants by email',
    'mp_finalize_submit'    => 'Finalize date',
    'mp_finalized'          => 'Date finalized.',
    'mp_finalized_to'       => 'Final date',
    'mp_reopen'             => 'Undo finalization',
    'mp_reopened'           => 'Finalization undone.',
    'mp_your_response'      => 'Your response',
    'mp_edit_your_response' => 'Edit your response',
    'mp_voting_as'          => 'You are voting as :name.',
    'mp_your_name'          => 'Your name',
    'mp_your_email'         => 'Email',
    'mp_email_ph'           => 'to be notified once the date is set (optional)',
    'mp_email_from_invite'  => 'This address comes from your invitation and is therefore fixed.',
    'mp_yes'                => 'Yes',
    'mp_maybe'              => 'If need be',
    'mp_no'                 => 'No',
    'mp_comment'            => 'Comment',
    'mp_comment_ph'         => 'optional',
    'mp_submit_response'    => 'Save response',
    'mp_update_response'    => 'Update response',
    'mp_vote_saved'         => 'Thanks! Your response has been saved.',
    'mp_organized_by'       => 'Organized by :name',
    'mp_location'           => 'Location',
    'mp_poll_not_found'     => 'This scheduling poll does not exist (any more).',
    'mp_err_title_required' => 'Please enter a title.',
    'mp_err_title_long'     => 'The title is too long.',
    'mp_err_desc_long'      => 'The description is too long.',
    'mp_err_loc_long'       => 'The location is too long.',
    'mp_err_no_options'     => 'Please provide at least one valid date/time option.',
    'mp_err_too_many_options'=> 'Too many date/time options.',
    'mp_err_deadline'       => 'The deadline is not a valid date.',
    'mp_err_option'         => 'Invalid date/time option.',
    'mp_err_closed'         => 'This poll is closed.',
    'mp_err_full'           => 'This poll has reached the maximum number of responses.',
    'mp_err_no_recipients'  => 'No valid recipients given.',
    'mp_err_invite_cap'     => 'This poll has reached the maximum of :max invitations.',
    'mp_err_name_required'  => 'Please enter your name.',
    'mp_err_email'          => 'Please enter a valid email address.',
    'mp_err_rate_limited'   => 'Too many responses in a short time. Please try again in a moment.',
    'mp_wd_0'               => 'Sun',
    'mp_wd_1'               => 'Mon',
    'mp_wd_2'               => 'Tue',
    'mp_wd_3'               => 'Wed',
    'mp_wd_4'               => 'Thu',
    'mp_wd_5'               => 'Fri',
    'mp_wd_6'               => 'Sat',
    'mp_mail_greeting'      => 'Hello :name,',
    'mp_mail_new_response_subject' => 'New response to your scheduling poll: :title',
    'mp_mail_new_response_body'    => ':name has responded to your scheduling poll ":title".',
    'mp_mail_view_results'  => 'View results',
    'mp_mail_finalized_subject'    => 'Date confirmed: :title',
    'mp_mail_finalized_body'       => 'The following date has been set for ":title":',
    'mp_mail_open_poll'     => 'Open the poll',
];
