Stand: SMTP-Test, Admin-Mail-Tab, Notifiable-Fix, Lazy-Quill

- Fix: Notifiable-Trait zum User-Model hinzugefuegt (behebt notify()-500er)
- Installer: SMTP-Verbindungstest mit EsmtpTransport + Ueberspringen-Link
- Admin: Neuer E-Mail-Tab mit SMTP-Konfiguration + Verbindungstest
- Admin: Lazy Quill-Initialisierung (nur sichtbare Locale wird geladen)
- Uebersetzungen: 17 neue Mail-Keys in allen 6 Sprachen

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Rhino
2026-03-02 07:30:37 +01:00
commit 2e24a40d68
9633 changed files with 1300799 additions and 0 deletions

548
lang/en/admin.php Executable file
View File

@@ -0,0 +1,548 @@
<?php
return [
'dashboard_title' => 'Admin Dashboard',
'stat_users' => 'Users',
'stat_players' => 'Players',
'stat_upcoming' => 'Upcoming Events',
'stat_invitations' => 'Open Invitations',
'quick_links' => 'Quick Links',
'new_event' => 'New Event',
'new_player' => 'New Player',
'new_invitation' => 'New Invitation',
'new_team' => 'New Team',
'open_responses_title' => 'Events with Open Responses',
'x_open' => ':count open',
'nav_teams' => 'Teams',
'nav_players' => 'Players',
'nav_users' => 'Users',
'nav_invitations' => 'Invitations',
'nav_events' => 'Events',
'nav_settings' => 'Settings',
'nav_verwaltung' => 'Management',
'actions' => 'Actions',
'action' => 'Action',
'please_select' => 'Please select',
'back_to_list' => 'Back to list',
'inactive' => 'Inactive',
'nr' => 'No.',
'photo' => 'Photo',
'date' => 'Date',
'location' => 'Location',
'all_status' => 'All Statuses',
'copied' => 'Copied!',
'copy' => 'Copy',
'created_by' => 'by',
'valid_until' => 'valid until',
'teams_title' => 'Teams',
'team_created' => 'Team has been created.',
'team_updated' => 'Team has been updated.',
'team_name' => 'Team Name',
'year_group' => 'Year Group',
'year_group_placeholder' => 'e.g. 2017/18',
'active' => 'Active',
'team_is_active' => 'Team is active',
'create_team' => 'Create Team',
'edit_team' => 'Edit Team',
'no_teams_yet' => 'No teams yet.',
'team_notes' => 'Notes',
'team_notes_placeholder' => 'Notes about the team (internal, only visible to admins)...',
'team_coaches' => 'Coaches',
'no_coaches_available' => 'No coaches available in the system.',
'team_players' => 'Players',
'team_parent_reps' => 'Parent Representatives',
'team_parent_reps_hint' => 'Parents with the "Parent Representative" role who have children on this team.',
'no_parent_reps' => 'No parent representatives for this team.',
'log_team_updated' => 'Team ":name" was updated',
'log_player_team_changed' => 'Player :name was moved to a different team',
'players_title' => 'Players',
'player_created' => 'Player has been created.',
'player_updated' => 'Player has been updated.',
'first_name' => 'First Name',
'last_name' => 'Last Name',
'birth_year' => 'Birth Year',
'jersey_number' => 'Jersey Number',
'photo_permission' => 'Photo Permission',
'notes' => 'Notes',
'parent_assigned' => 'Parent has been assigned.',
'parent_removed' => 'Assignment has been removed.',
'assign_parent' => 'Assign Parent',
'add_parent' => 'Add Parent',
'select_user' => 'Select User',
'assign' => 'Assign',
'relationship_label' => 'Relationship',
'relationship_placeholder' => 'e.g. Mother, Father',
'parents' => 'Parents',
'player_data' => 'Player Details',
'parent_assignment' => 'Parent Assignment',
'no_parents_yet' => 'No parents assigned yet.',
'confirm_remove_parent' => 'Really remove assignment?',
'remove' => 'Remove',
'no_players_yet' => 'No players yet.',
'users_title' => 'Users',
'user_toggled' => 'User has been :status.',
'role_updated' => 'Role has been updated.',
'cannot_deactivate_self' => 'You cannot deactivate your own account.',
'cannot_change_own_role' => 'You cannot change your own role.',
'activated' => 'activated',
'deactivated' => 'deactivated',
'deactivated_label' => 'Deactivated',
'children' => 'Children',
'phone' => 'Phone',
'last_login' => 'Last Login',
'never' => 'Never',
'deactivate' => 'Deactivate',
'activate' => 'Activate',
'you_suffix' => '(you)',
'edit' => 'Edit',
'edit_user' => 'Edit User',
'user_data' => 'User Data',
'user_updated' => 'User has been updated.',
'reset_password' => 'Reset Password',
'reset_password_hint' => 'Sends the user a password reset link via email.',
'reset_password_confirm' => 'Send a password reset link to the user via email?',
'password_reset_success' => 'New password has been generated.',
'new_password_label' => 'New password (visible once only):',
'password_only_visible_now' => 'This password is only shown now. Please share it and do not reload the page.',
'cannot_edit_own_role' => 'You cannot change your own role here.',
'cannot_assign_admin_role' => 'You cannot assign the admin role.',
'cannot_reset_own_password' => 'You cannot reset your own password via the admin area.',
'registered_at' => 'Registered on',
'invitations_title' => 'Invitations',
'invitation_created' => 'Invitation created. Link: :link',
'invitation_deleted' => 'Invitation has been deleted.',
'invitation_already_used' => 'Already redeemed invitations cannot be deleted.',
'create_invitation' => 'Create Invitation',
'assign_players' => 'Assign Players',
'email_optional' => 'Email address (optional)',
'email_optional_hint' => 'If set, only this email can register',
'expires_at' => 'Valid until',
'valid_for_days' => 'Valid for (days)',
'token' => 'Token',
'status' => 'Status',
'used' => 'Redeemed',
'expired' => 'Expired',
'pending' => 'Open',
'copy_link' => 'Copy Link',
'invite_link' => 'Invitation Link',
'no_assignment' => 'No assignment',
'no_invitations_yet' => 'No invitations created yet.',
'no_active_players' => 'No active players available.',
'confirm_delete_invitation' => 'Really delete invitation?',
'created_label' => 'Created',
'player_assignment_hint' => 'Select the children that should be automatically assigned to the new parent account.',
'events_title' => 'Events',
'event_created' => 'Event has been created.',
'event_updated' => 'Event has been updated.',
'event_deleted' => 'Event has been deleted.',
'event_title' => 'Title',
'start_at' => 'Start',
'date' => 'Date',
'time' => 'Time',
'end_at' => 'End',
'location_name' => 'Location Name',
'address' => 'Address',
'description' => 'Description',
'search_address' => 'Search address...',
'new_event_title' => 'New Event',
'edit_event_title' => 'Edit Event',
'no_events_yet' => 'No events yet.',
'confirm_delete_event' => 'Really delete event?',
'location_address' => 'Location / Address',
'location_name_hint' => 'Location name (e.g. Sports Hall North)',
'search_by_name' => 'Find address',
'location_name_placeholder' => 'e.g. BVB Stadium, Sports Hall West...',
'search_address_hint' => 'Enter address (min. 3 characters)...',
'description_placeholder' => 'Enter description...',
'assignments' => 'Assignments',
'catering_assignment' => 'Catering',
'timekeeper_assignment' => 'Timekeeper',
'geocoding_error' => 'Address search failed. Please try again.',
'geocoding_rate_limit' => 'Too many requests. Please wait a moment.',
'geocoding_no_results' => 'No address found. Please be more specific.',
'min_requirements' => 'Minimum Requirements',
'min_players' => 'Min. Players',
'min_parents' => 'Min. Parents',
'min_catering' => 'Min. Catering',
'min_timekeepers' => 'Min. Timekeepers',
'event_defaults_title' => 'Event Default Minimums',
'event_defaults_description' => 'Set default minimum values for new events per type. Admins can override these when creating events.',
// Locations management
'nav_locations' => 'Locations',
'locations_title' => 'Manage Locations',
'location_add' => 'Add New Location',
'location_name_label' => 'Name',
'location_save' => 'Save',
'location_created' => 'Location has been created.',
'location_updated' => 'Location has been updated.',
'location_deleted' => 'Location has been deleted.',
'location_confirm_delete' => 'Really delete this location?',
'locations_empty' => 'No locations yet.',
'known_locations' => 'Known Locations',
'address_manual_hint' => 'Enter address manually...',
// Settings
'settings_title' => 'Settings',
'settings_saved' => 'Settings saved.',
'settings_tab_general' => 'General',
'settings_tab_legal' => 'Legal',
'settings_tab_defaults' => 'Event Defaults',
'settings_tab_categories' => 'File Categories',
// File Management
'nav_files' => 'Files',
'files_title' => 'File Management',
'upload_file' => 'Upload File',
'file_uploaded' => 'File has been uploaded.',
'file_deleted' => 'File has been deleted.',
'file_category' => 'Category',
'select_category' => 'Select category',
'no_files_yet' => 'No files in this category yet.',
'no_files_at_all' => 'No files uploaded yet.',
'file_size' => 'Size',
'uploaded_by' => 'Uploaded by',
'uploaded_at' => 'Uploaded on',
'confirm_delete_file' => 'Really delete this file? All event attachments will be removed.',
'allowed_file_types' => 'Allowed file types: PDF, DOCX, XLSX, Images (JPG, PNG, GIF, WEBP)',
'max_file_size' => 'Maximum file size: 10 MB',
'file_categories' => 'File Categories',
'file_categories_description' => 'Manage the categories for file management.',
'new_category' => 'New Category',
'category_name' => 'Category Name',
'category_created' => 'Category has been created.',
'category_updated' => 'Category has been updated.',
'category_deleted' => 'Category has been deleted.',
'category_not_empty' => 'Category cannot be deleted because it still contains files.',
'confirm_delete_category' => 'Really delete this category?',
'event_files' => 'Files',
'attach_from_library' => 'Attach from library',
'upload_new_file' => 'Upload new file',
'attached_files' => 'Attached Files',
'detach_file' => 'Remove',
'no_attached_files' => 'No files attached.',
'profile_picture' => 'Profile Picture',
'upload_picture' => 'Upload picture',
'remove_picture' => 'Remove picture',
'picture_uploaded' => 'Profile picture has been updated.',
'picture_removed' => 'Profile picture has been removed.',
'max_picture_size' => 'Max. 2 MB (JPG, PNG, GIF, WEBP)',
'html_anchor_hint' => 'Tip: Add anchors with id attribute, e.g. &lt;h3 id="cookies"&gt;',
// Soft-Delete
'danger_zone' => 'Danger zone',
'delete_user' => 'Delete user',
'delete_user_hint' => 'The user will be deactivated and can be restored within 7 days. Historical data (comments, participations) will be preserved.',
'delete_player' => 'Delete player',
'delete_player_hint' => 'The player will be removed and can be restored within 7 days. Historical data (participations, events) will be preserved.',
'user_status_label' => 'User status',
'player_status_label' => 'Player status',
'deactivate_user_hint' => 'The user will no longer be able to log in.',
'activate_user_hint' => 'The user will be able to log in again.',
'deactivate_player_hint' => 'The player will no longer appear in event lists.',
'activate_player_hint' => 'The player will appear in event lists again.',
'player_toggled' => 'Player :status.',
'log_player_toggled' => 'Player :name :status',
'confirm_delete_user' => 'Are you sure you want to delete this user? They can be restored within 7 days.',
'confirm_delete_player' => 'Are you sure you want to delete this player? They can be restored within 7 days.',
'user_deleted' => 'User has been deleted.',
'user_restored' => 'User has been restored.',
'player_deleted' => 'Player has been deleted.',
'player_restored' => 'Player has been restored.',
'cannot_delete_self' => 'You cannot delete yourself.',
'cannot_delete_main_admin' => 'The main admin cannot be deleted.',
'restore_expired' => 'The restoration period has expired.',
'trash' => 'Trash',
'restore' => 'Restore',
'delete' => 'Delete',
'deleted_at' => 'Deleted at',
// Activity Log
'activity_log_title' => 'Activity Log',
'nav_activity_log' => 'Activity Log',
'log_category' => 'Category',
'log_all_categories' => 'All categories',
'log_cat_auth' => 'Authentication',
'log_cat_users' => 'Users',
'log_cat_players' => 'Players',
'log_cat_events' => 'Events',
'log_cat_files' => 'Files',
'log_cat_settings' => 'Settings',
'log_cat_dsgvo' => 'GDPR',
'log_from' => 'From',
'log_to' => 'To',
'log_filter' => 'Filter',
'log_reset' => 'Reset',
'log_time' => 'Time',
'log_user' => 'User',
'log_action' => 'Action',
'log_description' => 'Description',
'log_ip' => 'IP Address',
'log_system' => 'System',
'log_empty' => 'No entries found.',
'log_details' => 'Details',
'log_field' => 'Field',
'log_old_value' => 'Before',
'log_new_value' => 'After',
// Log descriptions
'log_login' => ':name logged in',
'log_logout' => ':name logged out',
'log_login_failed' => 'Failed login attempt for :email',
'log_registered' => ':name registered',
'log_user_updated' => 'User :name was updated',
'log_user_toggled' => 'User :name: status changed to :status',
'log_role_changed' => 'Role of :name changed to :role',
'log_password_reset' => 'Password of :name was reset',
'log_user_deleted' => 'User :name was deleted',
'log_user_restored' => 'User :name was restored',
'log_player_created' => 'Player :name was created',
'log_player_updated' => 'Player :name was updated',
'log_player_deleted' => 'Player :name was deleted',
'log_player_restored' => 'Player :name was restored',
'log_parent_assigned' => ':parent was assigned as parent of :player',
'log_parent_removed' => ':parent was removed as parent of :player',
'log_event_created' => 'Event ":title" was created',
'log_event_updated' => 'Event ":title" was updated',
'log_event_deleted' => 'Event ":title" was deleted',
'log_participant_changed' => 'Participation status for ":event" changed to :status',
'log_catering_changed' => 'Catering status for ":event" changed to :status',
'log_timekeeper_changed' => 'Timekeeper status for ":event" changed to :status',
'log_comment_created' => 'Comment added to ":event"',
'log_comment_deleted' => 'Comment deleted from ":event"',
'log_file_uploaded' => 'File ":name" uploaded',
'log_file_deleted' => 'File ":name" deleted',
'log_settings_updated' => 'Settings were updated',
'log_invitation_created' => 'Invitation created for :email',
// Statistics
'nav_statistics' => 'Statistics',
'statistics_title' => 'Game Statistics',
'total_games' => 'Total Games',
'wins' => 'Wins',
'losses' => 'Losses',
'draws' => 'Draws',
'win_rate' => 'Win Rate',
'chart_win_loss' => 'Wins / Losses',
'chart_player_participation' => 'Player Participation',
'chart_parent_involvement' => 'Parent Involvement',
'no_games_yet' => 'No games available yet.',
'filter_from' => 'From',
'filter_to' => 'To',
'filter_apply' => 'Filter',
'filter_reset' => 'Reset',
'all_teams' => 'All Teams',
'not_applicable' => 'N/A',
'min_users' => 'Min. Users',
'home_short' => 'H',
'away_short' => 'A',
'player_ranking_title' => 'Player Participation',
'player_ranking_desc' => 'Participation rate of players in :count games (home and away games).',
'games_played' => 'Played',
'games_assigned' => 'Assigned',
'participation_rate' => 'Rate',
'parent_ranking_title' => 'Parent Engagement',
'parent_ranking_desc' => 'Catering (:catering events) and timekeeping (:timekeeper events) — all published events.',
'total_contributions' => 'Total',
'statistics_enabled_label' => 'Enable statistics page',
'statistics_enabled_hint' => 'When disabled, the statistics page is only visible to the administrator.',
// Slogan & Favicon
'slogan_label' => 'Slogan',
'slogan_hint' => 'Displayed on the login page and in the footer.',
'favicon_label' => 'Favicon',
'favicon_hint' => 'ICO, PNG, SVG, JPG (max. 512 KB)',
'favicon_current' => 'Current favicon',
'favicon_remove' => 'Remove favicon',
'favicon_uploaded' => 'Favicon has been updated.',
'favicon_removed' => 'Favicon has been removed.',
// Undo / Revert
'log_revert' => 'Undo',
'log_revert_confirm' => 'Are you sure you want to undo this action?',
'log_revert_success' => 'Action has been successfully undone.',
'log_revert_not_possible' => 'This action cannot be undone.',
'log_reverted' => 'Undone: ":desc"',
'event_restored' => 'Event has been restored.',
'log_event_restored' => 'Event ":title" has been restored',
// Visibility
'settings_tab_visibility' => 'Visibility',
'visibility_description' => 'Control which features are visible for which roles. Administrators always see everything.',
'visibility_feature_statistics' => 'Statistics page',
'visibility_feature_catering_history' => 'Catering/timekeeper history',
// List Generator
'nav_list_generator' => 'List Generator',
'list_generator_title' => 'Create List',
'list_title' => 'Subject',
'list_subtitle' => 'Subtitle (optional)',
'list_notes' => 'Notes / Description',
'list_source' => 'Row Source',
'list_source_players' => 'Players',
'list_source_parents' => 'Parents',
'list_source_freetext' => 'Free Text',
'list_freetext_hint' => 'One line per entry',
'list_columns' => 'Columns',
'list_custom_columns' => 'Additional Columns',
'list_add_column' => 'Add Column',
'list_column_name' => 'Column Name',
'list_generate' => 'Generate List',
'list_result_title' => 'List Generated',
'list_print' => 'Print / Save as PDF',
'list_new' => 'Create New List',
'list_to_library' => 'Go to File Library',
'list_generated_at' => 'Generated on',
'list_all_teams' => 'All Teams',
'list_saved_info' => 'File ":name" was automatically saved in the library under "General".',
'list_download_pdf' => 'Download PDF',
'list_entries_count' => 'entries',
'log_list_generated' => 'List ":title" was generated',
'no_entries' => 'No entries found.',
// GDPR
'dsgvo_title' => 'GDPR Consent Declaration',
'dsgvo_short' => 'GDPR',
'dsgvo_consent_label' => 'Consent declaration confirmed',
'dsgvo_view_document' => 'View document',
'dsgvo_confirm' => 'Confirm',
'dsgvo_revoke' => 'Revoke',
'dsgvo_toggled' => 'GDPR status has been updated.',
'dsgvo_no_file' => 'No document has been uploaded yet.',
'dsgvo_no_document' => 'The user has not uploaded a consent declaration yet.',
'dsgvo_not_confirmed' => 'Not yet confirmed. Please review the document and then confirm.',
'dsgvo_confirmed_info' => 'Confirmed by :name on :date',
'dsgvo_confirmed_tooltip' => 'GDPR consent confirmed',
'dsgvo_pending_tooltip' => 'Document uploaded, confirmation pending',
'dsgvo_missing_tooltip' => 'No document uploaded',
'dsgvo_events_title' => 'GDPR Events (last 10)',
'dsgvo_action_dsgvo_consent_uploaded' => 'Uploaded',
'dsgvo_action_dsgvo_consent_confirmed' => 'Confirmed',
'dsgvo_action_dsgvo_consent_revoked' => 'Revoked',
'dsgvo_action_dsgvo_consent_removed' => 'Removed',
'dsgvo_action_account_self_deleted' => 'Account deleted',
'dsgvo_action_child_auto_deactivated' => 'Child deactivated',
'log_dsgvo_consent_uploaded' => ':name has uploaded a consent declaration',
'log_dsgvo_confirmed' => 'Consent declaration of :name has been confirmed',
'log_dsgvo_revoked' => 'Confirmation of consent declaration of :name has been revoked',
'log_dsgvo_consent_removed' => ':name has removed the consent declaration',
'log_account_self_deleted' => ':name has deleted their own account',
'log_child_auto_deactivated' => 'Player :child was automatically deactivated (sole parent :parent deleted account)',
// GDPR Pending Widget
'dsgvo_pending_title' => 'GDPR — Confirmation Pending',
'dsgvo_pending_count' => ':count declaration(s) pending',
'dsgvo_consent_document' => 'GDPR Consent Declaration',
'dsgvo_reject' => 'Reject',
'dsgvo_reject_confirm' => 'Are you sure you want to reject this consent declaration? The document will be deleted and the user will need to upload it again.',
'dsgvo_rejected' => 'Consent declaration has been rejected.',
'log_dsgvo_rejected' => 'Consent declaration of :name has been rejected',
'dsgvo_action_dsgvo_consent_rejected' => 'Rejected',
'dsgvo_preview_not_available' => 'Preview not available for this file type.',
// Factory Reset
'factory_reset_title' => 'Complete Reset',
'factory_reset_description' => 'Resets the entire WebApp to its initial state. After the reset, the installation wizard will start again.',
'factory_reset_deletes' => 'The following will be permanently deleted',
'factory_reset_item_users' => 'All users (including administrator)',
'factory_reset_item_data' => 'All teams, players, events, comments',
'factory_reset_item_settings' => 'All settings and file categories',
'factory_reset_item_files' => 'All uploaded files and profile pictures',
'factory_reset_warning' => 'This action CANNOT be undone! The app will be completely reset and the installation wizard will start.',
'factory_reset_confirm' => 'WARNING: The entire WebApp will be irreversibly reset and all data deleted. The installation wizard will start again. Are you sure?',
'factory_reset_button' => 'Reset WebApp completely',
// License & Support
'settings_tab_license' => 'License & Support',
'license_title' => 'License Key',
'license_description' => 'Enter your license key to receive support and updates.',
'license_key_label' => 'License Key',
'license_invalid' => 'The entered license key is invalid.',
'registration_status' => 'Registration Status',
'registration_active' => 'Registered',
'registration_inactive' => 'Not registered',
'register_now' => 'Register now',
'registration_success' => 'Installation registered successfully.',
'registration_failed' => 'Registration failed. Please try again later.',
'version_info' => 'System Information',
'update_available' => 'Update available: Version :version',
'update_details' => 'Show details',
'download_update' => 'Download update',
'installation_id_label' => 'Installation ID',
'nav_support' => 'Support',
'support_title' => 'Support Tickets',
'support_not_registered' => 'Installation not registered',
'support_register_hint' => 'The installation must be registered to use support. Only technical data (app name, URL, PHP version) will be transmitted.',
'support_new_ticket' => 'Create new ticket',
'support_subject' => 'Subject',
'support_category' => 'Category',
'support_category_bug' => 'Bug Report',
'support_category_feature' => 'Feature Request',
'support_category_question' => 'Question',
'support_category_other' => 'Other',
'support_message' => 'Message',
'support_submit' => 'Submit ticket',
'support_reply' => 'Reply',
'support_send_reply' => 'Send reply',
'support_reply_placeholder' => 'Write your reply...',
'support_ticket_created' => 'Ticket created successfully.',
'support_reply_sent' => 'Reply has been sent.',
'support_submit_failed' => 'Ticket could not be created. Please try again later.',
'support_reply_failed' => 'Reply could not be sent. Please try again later.',
'support_ticket_not_found' => 'Ticket not found.',
'support_no_tickets' => 'No tickets yet.',
'support_no_messages' => 'No messages yet.',
'support_ticket_id' => 'Ticket No.',
'support_status' => 'Status',
'support_status_open' => 'Open',
'support_status_in_progress' => 'In Progress',
'support_status_waiting' => 'Waiting',
'support_status_closed' => 'Closed',
'support_created_at' => 'Created',
'support_last_reply' => 'Last Reply',
'support_back_to_list' => 'Back to overview',
'support_system_info_note' => 'System information will be sent automatically.',
'support_sender_support' => 'Support',
'support_sender_you' => 'You',
'support_ticket_closed' => 'This ticket is closed.',
'installer_register_label' => 'Register installation',
'installer_register_hint' => 'Enables update notifications and support. Only technical data is transmitted (app name, URL, PHP version, app version).',
'installer_license_label' => 'License key (optional)',
'installer_license_hint' => 'Can also be entered later in the settings.',
// Password Reset (Admin + Self-Service)
'settings_tab_maintenance' => 'Maintenance',
'factory_reset_password_label' => 'Your password for confirmation',
'factory_reset_confirmation_label' => 'Security confirmation',
'factory_reset_confirmation_hint' => 'Type RESET-BESTÄTIGT to confirm the action.',
'password_reset_link_sent' => 'A password reset link has been sent via email.',
'password_reset_email_label' => 'Password Reset Email Template',
'password_reset_email_hint' => 'Placeholders: {name} = Username, {link} = Reset link, {app_name} = App name',
'log_password_reset_requested' => 'Password reset requested',
'log_password_changed_self' => ':name changed their password',
'log_dsgvo_viewed' => 'GDPR document of :name viewed',
// Multi-Language Legal Editor
'legal_language_label' => 'Language',
'legal_impressum_label' => 'Legal Notice',
'legal_datenschutz_label' => 'Privacy Policy',
'legal_password_reset_email_label' => 'Password Reset Email',
// Email Tab
'settings_tab_mail' => 'Email',
'mail_config_title' => 'Email Configuration',
'mail_config_hint' => 'SMTP settings for sending emails (e.g. password reset, notifications).',
'mail_mailer_label' => 'Sending Method',
'mail_log_mode' => 'No sending (Log)',
'mail_host_label' => 'SMTP Host',
'mail_port_label' => 'Port',
'mail_username_label' => 'Username',
'mail_password_label' => 'Password',
'mail_from_address_label' => 'Sender Address',
'mail_from_name_label' => 'Sender Name',
'mail_encryption_label' => 'Encryption',
'mail_encryption_none' => 'None',
'mail_save' => 'Save Mail Settings',
'mail_saved' => 'Mail settings have been saved.',
'mail_test_button' => 'Test Connection',
'mail_testing' => 'Testing connection...',
'mail_test_success' => 'SMTP connection successful!',
];

6
lang/en/auth.php Executable file
View File

@@ -0,0 +1,6 @@
<?php
return [
'failed' => 'These credentials do not match our records.',
'password' => 'The provided password is incorrect.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
];

33
lang/en/auth_ui.php Executable file
View File

@@ -0,0 +1,33 @@
<?php
return [
'login_title' => 'Login',
'email_label' => 'Email',
'password_label' => 'Password',
'remember_me' => 'Remember me',
'login_button' => 'Login',
'register_title' => 'Register',
'name_label' => 'Name',
'children_assigned' => 'Your account will be assigned to the following children:',
'password_min' => '(min. 8 characters)',
'password_confirm_label' => 'Confirm password',
'create_account' => 'Create account',
'already_registered' => 'Already registered?',
'go_to_login' => 'Go to login',
'email_fixed_by_invitation' => 'The email address is set by the invitation.',
'invalid_invitation' => 'This invitation link is invalid or expired.',
'welcome' => 'Welcome! Your account has been created.',
'forgot_password_link' => 'Forgot password?',
'forgot_password_title' => 'Reset Password',
'forgot_password_description' => 'Enter your email address and we will send you a link to reset your password.',
'send_reset_link' => 'Send link',
'back_to_login' => 'Back to login',
'reset_password_title' => 'Set New Password',
'reset_password_button' => 'Reset Password',
'new_password_label' => 'New Password',
'confirm_password_label' => 'Confirm Password',
'login_failed' => 'These credentials are invalid.',
'email_must_match_invitation' => 'The email address must match the invitation: :email',
'cookie_notice' => 'This site only uses a technically necessary session cookie. No tracking.',
'cookie_notice_link' => 'Learn more',
'account_deactivated' => 'Your account has been deactivated. Please contact the administrator.',
];

63
lang/en/events.php Executable file
View File

@@ -0,0 +1,63 @@
<?php
return [
'title' => 'Events',
'no_events' => 'No events found.',
'no_upcoming' => 'No upcoming events.',
'upcoming_title' => 'Upcoming Events',
'cancelled_label' => 'Cancelled',
'draft_label' => 'Draft',
'cancelled_banner' => 'This event has been cancelled.',
'draft_banner' => 'Draft — only visible to admins.',
'back_to_list' => 'Back to event list',
'description' => 'Description',
'plan_route' => 'Plan route',
'start_navigation' => 'Start navigation',
'participants' => 'Participants',
'confirmations' => 'Accepted',
'rejections' => 'Declined',
'open_responses' => 'Open',
'participation_updated' => 'Participation updated.',
'catering' => 'Catering / Food',
'bring_something' => 'Bringing something',
'bring_nothing' => 'Not bringing anything',
'catering_note_placeholder' => 'e.g. Bringing cake',
'catering_updated' => 'Catering status updated.',
'no_catering_yet' => 'No catering commitments yet.',
'timekeeper' => 'Timekeeper',
'timekeeper_yes' => 'Yes, I can',
'timekeeper_no' => 'No',
'catering_short' => 'Catering',
'timekeeper_short' => 'Timekeeper',
'no_timekeeper_yet' => 'No timekeeper assigned yet.',
'timekeeper_updated' => 'Timekeeper status updated.',
'comments' => 'Comments',
'comment_placeholder' => 'Write a comment...',
'no_comments' => 'No comments yet.',
'comment_deleted' => '[Deleted]',
'confirm_delete_comment' => 'Delete comment?',
'comment_added' => 'Comment added.',
'comment_removed' => 'Comment deleted.',
'hello_user' => 'Hello, :name!',
'upcoming_events' => 'Upcoming Events',
'calendar' => 'Calendar',
'today' => 'Today',
'month_view' => 'Month',
'year_view' => 'Year',
// Files
'files' => 'Files',
'download' => 'Download',
'no_files' => 'No files attached.',
// Opponent & Score
'opponent' => 'Opponent',
'score' => 'Score',
'score_home' => 'Home',
'score_away' => 'Away',
'vs' => 'vs.',
// Staff visibility
'signed_up' => 'signed up',
'withdrawn' => 'withdrawn',
'deleted_label' => 'deleted',
];

5
lang/en/pagination.php Executable file
View File

@@ -0,0 +1,5 @@
<?php
return [
'previous' => '&laquo; Previous',
'next' => 'Next &raquo;',
];

13
lang/en/passwords.php Executable file
View File

@@ -0,0 +1,13 @@
<?php
return [
'reset' => 'Your password has been reset.',
'sent' => 'We have sent you a password reset link.',
'throttled' => 'Please wait before trying again.',
'token' => 'This password reset token is invalid.',
'user' => 'No user could be found with this email address.',
'reset_subject' => 'Reset Password — :app',
'reset_greeting' => 'Hello :name,',
'reset_line1' => 'You are receiving this email because a password reset request was made for your account.',
'reset_line2' => 'This password reset link will expire in :count minutes.',
'reset_line3' => 'If you did not request a password reset, no further action is required.',
];

43
lang/en/profile.php Executable file
View File

@@ -0,0 +1,43 @@
<?php
return [
'title' => 'My Profile',
'name_label' => 'Name',
'email_label' => 'Email',
'email_readonly' => 'The email address cannot be changed.',
'phone_label' => 'Phone (mobile)',
'role_label' => 'Role',
'language_label' => 'Language',
'my_children' => 'My Children',
'updated' => 'Profile updated.',
// Profile picture
'profile_picture' => 'Profile Picture',
'upload_picture' => 'Upload picture',
'remove_picture' => 'Remove picture',
'max_picture_size' => 'Max. 2 MB (JPG, PNG, GIF, WEBP)',
// GDPR consent declaration
'dsgvo_title' => 'GDPR Consent Declaration',
'dsgvo_description' => 'Upload the signed consent declaration as a photo or PDF here. One declaration applies for both parents jointly.',
'dsgvo_upload' => 'Upload declaration',
'dsgvo_replace' => 'Replace',
'dsgvo_remove' => 'Remove declaration',
'dsgvo_file_hint' => 'PDF or image (max. 10 MB)',
'dsgvo_uploaded' => 'Consent declaration has been uploaded.',
'dsgvo_removed' => 'Consent declaration has been removed.',
'dsgvo_view' => 'View',
'dsgvo_confirmed' => 'Confirmed',
'dsgvo_pending' => 'Waiting for confirmation by admin/coach',
'dsgvo_confirmed_by' => 'Confirmed by :name on :date',
'dsgvo_confirm_remove' => 'Really remove the consent declaration? Any existing confirmation will also be reset.',
// Delete account
'danger_zone' => 'Danger Zone',
'delete_account' => 'Delete Account',
'delete_account_hint' => 'Your profile will be deactivated and can be restored by an administrator within 7 days. Historical data (comments, participations) will be preserved.',
'delete_warning_children' => 'Warning: You are the only parent for the following children. They will also be deactivated:',
'delete_confirm' => 'Do you really want to delete your account? This can only be undone by an administrator.',
'account_deleted' => 'Your account has been deleted.',
'cannot_delete_admin' => 'The administrator account cannot be deleted.',
'cannot_delete_staff' => 'Coaches and admins cannot delete their account via the profile page.',
];

108
lang/en/ui.php Executable file
View File

@@ -0,0 +1,108 @@
<?php
return [
'dashboard' => 'Dashboard',
'events' => 'Events',
'admin' => 'Admin',
'profile' => 'Profile',
'logout' => 'Logout',
'back_to_app' => 'Back to App',
'login' => 'Login',
'save' => 'Save',
'cancel' => 'Cancel',
'edit' => 'Edit',
'delete' => 'Delete',
'create' => 'Create',
'filter' => 'Filter',
'send' => 'Send',
'back' => 'Back',
'yes' => 'Yes',
'no' => 'No',
'open' => 'Open',
'all_teams' => 'All Teams',
'all_types' => 'All Types',
'upcoming' => 'Upcoming',
'past' => 'Past',
'period' => 'Period',
'team' => 'Team',
'type' => 'Type',
'name' => 'Name',
'email' => 'Email',
'password' => 'Password',
'role' => 'Role',
'language' => 'Language',
'impressum' => 'Imprint',
'privacy' => 'Privacy',
'no_entries' => 'No entries available.',
'clock' => '',
'date_format' => 'D, m/d/Y, H:i',
'date_format_long' => 'l, F d, Y, H:i',
'date_format_short' => 'm/d/Y H:i',
'date_format_date' => 'm/d/Y',
'footer_impressum' => 'Imprint',
'footer_privacy' => 'Privacy',
'pwa_install_title' => 'Install App',
'pwa_install_text' => 'Add the app to your home screen for quick access.',
'pwa_install_btn' => 'Install',
'pwa_ios_steps' => 'Tap <strong>⋯</strong> (Menu), then <strong>⬆</strong> (Share) and select "Add to Home Screen".',
'error_403_title' => 'Access Denied',
'error_403_text' => 'You do not have permission to access this page.',
'error_404_title' => 'Page Not Found',
'error_404_text' => 'The requested page could not be found.',
'error_500_title' => 'Server Error',
'error_500_text' => 'An internal error has occurred. Please try again later.',
'back_to_dashboard' => 'Back to Dashboard',
'enums' => [
'event_type' => [
'home_game' => 'Home Game',
'away_game' => 'Away Game',
'training' => 'Training',
'tournament' => 'Tournament',
'meeting' => 'Meeting',
'other' => 'Other',
],
'event_status' => [
'published' => 'Published',
'cancelled' => 'Cancelled',
'draft' => 'Draft',
],
'participant_status' => [
'yes' => 'Accepted',
'no' => 'Declined',
'unknown' => 'Open',
],
'catering_status' => [
'yes' => 'Yes',
'no' => 'No',
'unknown' => 'Open',
],
'user_role' => [
'admin' => 'Administrator',
'coach' => 'Coach',
'parent_rep' => 'Parent Representative',
'user' => 'Parent',
],
],
'locales' => [
'de' => 'Deutsch',
'en' => 'English',
'pl' => 'Polski',
'ru' => 'Русский',
'ar' => 'العربية',
'tr' => 'Türkçe',
],
// GDPR banner
'dsgvo_banner_title' => 'GDPR Consent Declaration Required',
'dsgvo_banner_text' => 'A signed GDPR consent declaration is required to use this app. Please upload the declaration as a photo or PDF in your profile. The app can only be fully used after the upload.',
'dsgvo_banner_action' => 'Upload in profile now',
'dsgvo_banner_pending_title' => 'Consent declaration under review',
'dsgvo_banner_pending_text' => 'Your GDPR consent declaration has been submitted and is under review. Until confirmed by an administrator, the app is in read-only mode — participation, catering, timekeeping, and comments are locked.',
'dsgvo_restricted' => 'Your GDPR consent declaration has not been confirmed yet. Please wait for approval by an administrator.',
'dsgvo_restricted_hint' => 'GDPR consent not yet confirmed — actions locked.',
// Files
'files' => 'Files',
'download' => 'Download',
'all' => 'All',
'close' => 'Close',
];

129
lang/en/validation.php Executable file
View File

@@ -0,0 +1,129 @@
<?php
return [
'accepted' => ':attribute must be accepted.',
'active_url' => ':attribute is not a valid URL.',
'after' => ':attribute must be a date after :date.',
'after_or_equal' => ':attribute must be a date after or equal to :date.',
'alpha' => ':attribute may only contain letters.',
'alpha_dash' => ':attribute may only contain letters, numbers, dashes, and underscores.',
'alpha_num' => ':attribute may only contain letters and numbers.',
'array' => ':attribute must be an array.',
'before' => ':attribute must be a date before :date.',
'before_or_equal' => ':attribute must be a date before or equal to :date.',
'between' => [
'numeric' => ':attribute must be between :min and :max.',
'file' => ':attribute must be between :min and :max kilobytes.',
'string' => ':attribute must be between :min and :max characters.',
'array' => ':attribute must have between :min and :max items.',
],
'boolean' => ':attribute must be true or false.',
'confirmed' => ':attribute confirmation does not match.',
'date' => ':attribute is not a valid date.',
'date_equals' => ':attribute must be a date equal to :date.',
'date_format' => ':attribute does not match the format :format.',
'different' => ':attribute and :other must be different.',
'digits' => ':attribute must be :digits digits.',
'digits_between' => ':attribute must be between :min and :max digits.',
'email' => ':attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'file' => ':attribute must be a file.',
'filled' => ':attribute must have a value.',
'gt' => [
'numeric' => ':attribute must be greater than :value.',
'file' => ':attribute must be greater than :value kilobytes.',
'string' => ':attribute must be greater than :value characters.',
'array' => ':attribute must have more than :value items.',
],
'gte' => [
'numeric' => ':attribute must be greater than or equal to :value.',
'file' => ':attribute must be greater than or equal to :value kilobytes.',
'string' => ':attribute must be at least :value characters.',
'array' => ':attribute must have at least :value items.',
],
'image' => ':attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => ':attribute does not exist in :other.',
'integer' => ':attribute must be an integer.',
'ip' => ':attribute must be a valid IP address.',
'json' => ':attribute must be a valid JSON string.',
'lt' => [
'numeric' => ':attribute must be less than :value.',
'file' => ':attribute must be less than :value kilobytes.',
'string' => ':attribute must be fewer than :value characters.',
'array' => ':attribute must have fewer than :value items.',
],
'lte' => [
'numeric' => ':attribute must be less than or equal to :value.',
'file' => ':attribute must be less than or equal to :value kilobytes.',
'string' => ':attribute may not have more than :value characters.',
'array' => ':attribute may not have more than :value items.',
],
'max' => [
'numeric' => ':attribute may not be greater than :max.',
'file' => ':attribute may not be greater than :max kilobytes.',
'string' => ':attribute may not have more than :max characters.',
'array' => ':attribute may not have more than :max items.',
],
'min' => [
'numeric' => ':attribute must be at least :min.',
'file' => ':attribute must be at least :min kilobytes.',
'string' => ':attribute must be at least :min characters.',
'array' => ':attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => ':attribute must be a number.',
'present' => ':attribute must be present.',
'regex' => ':attribute format is invalid.',
'required' => ':attribute is required.',
'required_if' => ':attribute is required when :other is :value.',
'required_unless' => ':attribute is required unless :other is in :values.',
'required_with' => ':attribute is required when :values is present.',
'required_with_all' => ':attribute is required when :values are present.',
'required_without' => ':attribute is required when :values is not present.',
'required_without_all' => ':attribute is required when none of :values are present.',
'same' => ':attribute and :other must match.',
'size' => [
'numeric' => ':attribute must be :size.',
'file' => ':attribute must be :size kilobytes.',
'string' => ':attribute must be :size characters.',
'array' => ':attribute must contain :size items.',
],
'string' => ':attribute must be a string.',
'timezone' => ':attribute must be a valid timezone.',
'unique' => ':attribute has already been taken.',
'url' => ':attribute must be a valid URL.',
'password' => [
'letters' => ':attribute must contain at least one letter.',
'mixed' => ':attribute must contain at least one uppercase and one lowercase letter.',
'numbers' => ':attribute must contain at least one number.',
'symbols' => ':attribute must contain at least one symbol.',
'uncompromised' => ':attribute has appeared in a data leak. Please choose a different password.',
],
'attributes' => [
'name' => 'Name',
'email' => 'Email',
'password' => 'Password',
'password_confirmation' => 'Password Confirmation',
'title' => 'Title',
'body' => 'Message',
'type' => 'Type',
'status' => 'Status',
'team_id' => 'Team',
'start_date' => 'Date',
'start_time' => 'Time',
'location_name' => 'Location',
'address_text' => 'Address',
'description_html' => 'Description',
'first_name' => 'First Name',
'last_name' => 'Last Name',
'birth_year' => 'Birth Year',
'jersey_number' => 'Jersey Number',
'note' => 'Note',
'season' => 'Season',
'player_id' => 'Player',
'parent_id' => 'Parent',
'relationship_label' => 'Relationship',
],
];