Files
fotospiel-app/resources/lang/en/admin.php
Codex Agent b9708d5174
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled
Enhance Event admin UI and fix translations
- Remove default_locale and primary_join_token columns from event list
- Add read-only join link field to event edit form
- Add missing translations for used/remaining photos and join link
- Fix array-to-string conversion error in join link modal
2026-01-21 11:20:22 +01:00

799 lines
28 KiB
PHP

<?php
return [
'nav' => [
'platform' => 'Platform',
'library' => 'Library',
'content' => 'Content',
'daily_ops' => 'Daily Ops',
'weekly_ops' => 'Weekly Ops',
'rare_admin' => 'Rare / Admin',
'platform_management' => 'Platform Management',
'events' => 'Events',
'tenants' => 'Tenants',
'curation' => 'Curation',
'event_management' => 'Event Management',
'tasks_emotions' => 'Tasks & Emotions',
'content_library' => 'Content & Library',
'billing' => 'Billing & Finance',
'commercial' => 'Commercial',
'infrastructure' => 'Infrastructure',
'storage' => 'Storage',
'feedback_support' => 'Feedback & Support',
'branding' => 'Branding',
'security' => 'Security',
],
'common' => [
'error' => 'Error',
'key' => 'Key',
'value' => 'Value',
'locale' => 'Locale',
'german' => 'German',
'english' => 'English',
'import' => 'Import',
'import_csv' => 'Import CSV',
'download_csv_template' => 'Download CSV Template',
'csv_file' => 'CSV file',
'close' => 'Close',
'hash' => '#',
'slug' => 'Slug',
'event' => 'Event',
'tenant' => 'Tenant',
'uploads' => 'Uploads',
'uploads_today' => 'Uploads today',
'thumb' => 'Thumb',
'likes' => 'Likes',
'emotion' => 'Emotion',
'event_type' => 'Event Type',
'last_activity' => 'Last activity',
'credits' => 'Event bundle',
'settings' => 'Settings',
'join' => 'Join',
'unnamed' => 'Unnamed',
'from' => 'From',
'until' => 'Until',
'yes' => 'Yes',
'no' => 'No',
],
'photos' => [
'fields' => [
'event' => 'Event',
'photo' => 'Photo',
'is_featured' => 'Is Featured',
'metadata' => 'Metadata',
'likes' => 'Likes',
],
'actions' => [
'feature' => 'Feature',
'unfeature' => 'Unfeature',
'feature_selected' => 'Feature selected',
'unfeature_selected' => 'Unfeature selected',
],
'table' => [
'photo' => 'Photo',
'event' => 'Event',
'likes' => 'Likes',
],
],
'moderation' => [
'navigation' => [
'label' => 'Moderation queue',
],
'sections' => [
'photo' => 'Photo',
'moderation' => 'Moderation',
],
'fields' => [
'photo' => 'Photo',
'event' => 'Event',
'tenant' => 'Tenant',
'uploader' => 'Uploader',
'uploaded_at' => 'Uploaded',
'ingest_source' => 'Ingest source',
'status' => 'Status',
'moderation_notes' => 'Moderation notes',
'moderated_by' => 'Moderated by',
'moderated_at' => 'Moderated at',
'security_scan_status' => 'Security scan',
'security_scan_message' => 'Security scan message',
'security_scanned_at' => 'Security scanned at',
],
'table' => [
'photo' => 'Photo',
'event' => 'Event',
'tenant' => 'Tenant',
'uploader' => 'Uploader',
'status' => 'Status',
'security_scan' => 'Security scan',
'ingest_source' => 'Source',
'uploaded_at' => 'Uploaded',
'moderated_by' => 'Moderator',
'moderated_at' => 'Moderated',
],
'filters' => [
'status' => 'Status',
'ingest_source' => 'Ingest source',
'security_scan_status' => 'Security scan',
'uploaded_at' => 'Uploaded at',
],
'actions' => [
'approve' => 'Approve',
'reject' => 'Reject',
'hide' => 'Hide',
'approve_selected' => 'Approve selected',
'reject_selected' => 'Reject selected',
'hide_selected' => 'Hide selected',
],
'status' => [
'pending' => 'Pending',
'approved' => 'Approved',
'rejected' => 'Rejected',
'hidden' => 'Hidden',
],
'ingest_sources' => [
'guest_pwa' => 'Guest PWA',
'tenant_admin' => 'Tenant admin',
'photobooth' => 'Photobooth',
'sparkbooth' => 'Sparkbooth',
'unknown' => 'Unknown',
],
'security_scan' => [
'pending' => 'Pending',
'clean' => 'Clean',
'infected' => 'Infected',
'skipped' => 'Skipped',
'stripped' => 'Stripped',
'error' => 'Error',
],
],
'feedback' => [
'navigation' => [
'label' => 'Feedback queue',
],
'sections' => [
'moderation' => 'Moderation',
],
'fields' => [
'status' => 'Status',
'moderation_notes' => 'Moderation notes',
'moderated_by' => 'Moderated by',
'moderated_at' => 'Moderated at',
],
'table' => [
'status' => 'Status',
'moderated_by' => 'Moderator',
'moderated_at' => 'Moderated',
],
'filters' => [
'status' => 'Status',
],
'actions' => [
'resolve' => 'Resolve',
'hide' => 'Hide',
'delete' => 'Delete',
'resolve_selected' => 'Resolve selected',
'hide_selected' => 'Hide selected',
'delete_selected' => 'Delete selected',
],
'status' => [
'pending' => 'Pending',
'resolved' => 'Resolved',
'hidden' => 'Hidden',
'deleted' => 'Deleted',
],
],
'paddle_health' => [
'navigation' => [
'label' => 'Paddle health',
],
],
'integrations_health' => [
'navigation' => [
'label' => 'Integrations health',
],
'status' => [
'healthy' => 'Healthy',
'pending' => 'Pending',
'degraded' => 'Degraded',
'unconfigured' => 'Unconfigured',
'unknown' => 'Unknown',
],
'heading' => 'Integrations health',
'help' => 'Operational snapshot of Paddle/RevenueCat webhooks, queue backlog, and recent failures.',
'configured' => 'Configured',
'unconfigured' => 'Unconfigured',
'last_received' => 'Last received',
'last_processed' => 'Last processed',
'processing_lag' => 'Processing lag',
'pending_events' => 'Pending events',
'recent_failures' => 'Failures (24h)',
'queue_backlog' => 'Queue backlog',
'failed_jobs' => 'Failed jobs',
'last_error' => 'Last error',
'empty' => 'No integration health data available yet.',
],
'guest_policy' => [
'navigation' => [
'label' => 'Guest policy',
],
'sections' => [
'toggles' => 'Guest toggles',
'rate_limits' => 'Rate limits',
'retention' => 'Retention defaults',
],
'fields' => [
'guest_downloads_enabled' => 'Allow guest downloads',
'guest_sharing_enabled' => 'Allow guest sharing',
'guest_upload_visibility' => 'Guest upload visibility',
'upload_visibility_review' => 'Review required',
'upload_visibility_immediate' => 'Immediate publish',
'per_device_upload_limit' => 'Uploads per device (per event)',
'join_token_failure_limit' => 'Join token failure limit',
'join_token_failure_decay_minutes' => 'Join token failure decay (minutes)',
'join_token_access_limit' => 'Join token access limit',
'join_token_access_decay_minutes' => 'Join token access decay (minutes)',
'join_token_download_limit' => 'Join token download limit',
'join_token_download_decay_minutes' => 'Join token download decay (minutes)',
'join_token_ttl_hours' => 'Join token default TTL (hours)',
'share_link_ttl_hours' => 'Share link TTL (hours)',
'guest_notification_ttl_hours' => 'Guest notification default TTL (hours)',
],
'help' => [
'zero_disables' => '0 disables throttling.',
'join_token_ttl' => '0 keeps tokens active until revoked or limited.',
'notification_ttl' => 'Leave empty to keep notifications until explicitly expired.',
],
'actions' => [
'save' => 'Save changes',
],
'notifications' => [
'saved' => 'Guest policy updated.',
],
],
'ops_health' => [
'navigation' => [
'label' => 'Ops health',
],
'heading' => 'Ops health',
'subheading' => 'Storage and queue snapshots for the upload pipeline.',
'help' => 'Snapshots are generated by scheduled commands: storage:monitor and storage:check-upload-queues.',
'snapshot_age' => 'Updated :age',
'snapshot_missing' => 'Snapshot missing',
'pipeline' => [
'label' => 'Upload pipeline',
'total' => 'Total assets',
'pending' => 'Pending assets',
'failed' => 'Failed assets',
'hot' => 'Hot assets',
'archived' => 'Archived assets',
'alerts' => 'Alerts',
'hot_hint' => 'Hot: :count',
'archived_hint' => 'Archived: :count',
'no_snapshot' => 'Snapshot missing',
'no_snapshot_desc' => 'Run storage:monitor to generate a snapshot.',
],
'queue' => [
'heading' => 'Queue health',
'description' => 'Upload queue sizes, failed jobs, and stalled assets.',
'connection' => 'Connection',
'snapshot' => 'Snapshot',
'stalled_assets' => 'Pending assets > :minutes min',
'no_snapshot' => 'No queue snapshot available. Run storage:check-upload-queues.',
'no_queues' => 'No queues configured.',
'alerts_heading' => 'Alerts',
'alerts_empty' => 'No active alerts.',
'thresholds' => 'Thresholds',
'size' => 'Size',
'failed' => 'Failed',
'queue' => 'Queue',
'utilization' => 'Utilization',
'utilization_of' => ':percent% of :label',
'utilization_na' => 'N/A',
],
'alert_types' => [
'size' => 'Queue size above threshold (:size)',
'failed_jobs' => 'Failed jobs detected (:failed)',
'pending_assets' => ':count assets pending for more than :minutes min',
],
'severity' => [
'ok' => 'OK',
'warning' => 'Warning',
'critical' => 'Critical',
'unknown' => 'Unknown',
'error' => 'Error',
'unavailable' => 'Unavailable',
],
],
'join_token_analytics' => [
'navigation' => [
'label' => 'Join token analytics',
],
'heading' => 'Join token analytics',
'subheading' => 'Monitor guest access and join-token activity across events.',
'filters' => [
'range' => 'Time range',
'event' => 'Event',
'event_placeholder' => 'All events',
'range_options' => [
'2h' => 'Last 2 hours',
'6h' => 'Last 6 hours',
'12h' => 'Last 12 hours',
'24h' => 'Last 24 hours',
'7d' => 'Last 7 days',
'event_day' => 'Event day',
],
],
'stats' => [
'success' => 'Success',
'failures' => 'Failures',
'rate_limited' => 'Rate limited',
'uploads' => 'Uploads',
'failure_ratio' => 'Failure ratio',
'no_data' => '—',
],
'trend' => [
'heading' => 'Join-token activity',
'success' => 'Success',
'failures' => 'Failures',
'rate_limited' => 'Rate limited',
'uploads' => 'Uploads',
],
'table' => [
'heading' => 'Top tokens',
'token' => 'Token',
'event' => 'Event',
'tenant' => 'Tenant',
'success' => 'Success',
'failures' => 'Failures',
'rate_limited' => 'Rate limited',
'uploads' => 'Uploads',
'last_seen' => 'Last seen',
],
],
'events' => [
'fields' => [
'tenant' => 'Tenant',
'name' => 'Event Name',
'slug' => 'Slug',
'date' => 'Event Date',
'type' => 'Event Type',
'default_locale' => 'Default Locale',
'settings' => 'Settings',
'join_link' => 'Invitation Link',
],
'table' => [
'tenant' => 'Tenant',
'join' => 'Join',
'join_tokens_total' => 'Invitations: :count',
'package' => 'Package',
'used_photos' => 'Used Photos',
'remaining_photos' => 'Remaining', ],
'relation_managers' => [
'event_packages' => [
'title' => 'Event Packages',
],
],
'actions' => [
'toggle_active' => 'Toggle Active',
'join_link_qr' => 'Invitation Link & QR',
'download_photos' => 'Download all photos',
],
'modal' => [
'join_link_heading' => 'Event Invitation Link',
],
'messages' => [
'join_link_copied' => 'Invitation link copied',
],
'join_link' => [
'event_label' => 'Event',
'slug_label' => 'Slug: :slug',
'link_label' => 'Invitation Link',
'copy_link' => 'Copy',
'no_tokens' => 'No invitations yet. Create one in the admin app to share your event.',
'token_default' => 'Invitation #:id',
'token_usage' => 'Usage: :usage / :limit',
'token_active' => 'Active',
'token_inactive' => 'Inactive',
'layouts_heading' => 'Printable layouts',
'layouts_fallback' => 'Open layout overview',
'token_expiry' => 'Expires at :date',
'deprecated_notice' => 'Direct access via slug :slug has been retired. Share the invitations below or manage QR layouts in the admin app.',
'open_admin' => 'Open admin app',
],
'analytics' => [
'success_total' => 'Successful checks',
'failure_total' => 'Failures',
'rate_limited_total' => 'Rate limited',
'recent_24h' => 'Requests (24h)',
'last_seen_at' => 'Last activity: :date',
],
],
'legal_pages' => [
'fields' => [
'slug' => 'Slug',
'title_localized' => 'Title (de/en)',
'content_localization' => 'Content Localization',
'content_de' => 'Content (German)',
'content_en' => 'Content (English)',
'is_published' => 'Is Published',
'effective_from' => 'Effective From',
'version' => 'Version',
],
],
'emotions' => [
'sections' => [
'content_localization' => 'Content Localization',
],
'fields' => [
'name_de' => 'Name (German)',
'description_de' => 'Description (German)',
'name_en' => 'Name (English)',
'description_en' => 'Description (English)',
'icon_emoji' => 'Icon/Emoji',
'color' => 'Color',
'sort_order' => 'Sort Order',
'is_active' => 'Is Active',
'event_types' => 'Event Types',
],
'table' => [
'name' => 'Name',
'icon' => 'Icon',
'color' => 'Color',
'is_active' => 'Active',
'sort_order' => 'Sort Order',
],
'import' => [
'heading' => 'Import Emotions (CSV)',
],
],
'event_types' => [
'sections' => [
'name_localization' => 'Name Localization',
],
'fields' => [
'name_de' => 'Name (German)',
'name_en' => 'Name (English)',
'slug' => 'Slug',
'icon' => 'Icon',
'settings' => 'Settings',
'emotions' => 'Emotions',
],
'messages' => [
'delete_constraint_error' => 'This event type is currently in use and cannot be deleted.',
],
],
'tasks' => [
'menu' => 'Tasks',
'fields' => [
'event_type_optional' => 'Event Type (optional)',
'content_localization' => 'Content Localization',
'title_de' => 'Title (German)',
'description_de' => 'Description (German)',
'example_de' => 'Example Text (German)',
'title_en' => 'Title (English)',
'description_en' => 'Description (English)',
'example_en' => 'Example Text (English)',
'emotion' => 'Emotion',
'event_type' => 'Event Type',
'difficulty' => [
'label' => 'Difficulty',
'easy' => 'Easy',
'medium' => 'Medium',
'hard' => 'Hard',
],
],
'table' => [
'title' => 'Title',
'is_active' => 'Active',
'sort_order' => 'Sort Order',
],
'import' => [
'heading' => 'Import Tasks (CSV)',
],
],
'task_collections' => [
'menu' => 'Task collections',
'fields' => [
'event_type_optional' => 'Event Type (optional)',
'content_localization' => 'Content Localization',
'name_de' => 'Name (German)',
'description_de' => 'Description (German)',
'name_en' => 'Name (English)',
'description_en' => 'Description (English)',
'is_default' => 'Default collection',
'position' => 'Position',
],
'table' => [
'name' => 'Name',
'event_type' => 'Event Type',
'slug' => 'Slug',
'is_default' => 'Default',
'position' => 'Position',
'tasks' => 'Tasks',
'events' => 'Events',
],
],
'widgets' => [
'events_active_today' => [
'heading' => 'Events active today',
],
'recent_uploads' => [
'heading' => 'Recent uploads',
],
'top_tenants_by_uploads' => [
'heading' => 'Top tenants by uploads',
],
'uploads_per_day' => [
'heading' => 'Uploads (14 days)',
],
'credit_alerts' => [
'low_balance_label' => 'Tenants with low event bundle',
'low_balance_desc' => 'May require follow-up',
'monthly_revenue_label' => 'Revenue (month)',
'monthly_revenue_desc' => 'Current month (:month)',
'active_subscriptions_label' => 'Active subscriptions',
'active_subscriptions_desc' => 'Recurring packages in good standing',
],
'revenue_trend' => [
'heading' => 'Monthly revenue',
'series' => 'Revenue (€)',
],
'top_tenants_by_revenue' => [
'heading' => 'Top tenants by revenue',
'total' => 'Total (€)',
'count' => 'Purchases',
],
],
'notifications' => [
'file_not_found' => 'File not found',
'imported_rows' => 'Imported :count rows',
'failed_count' => ':count failed',
],
'tenants' => [
'fields' => [
'name' => 'Tenant name',
'slug' => 'Slug',
'contact_email' => 'Contact email',
'event_credits_balance' => 'Event bundle',
'features' => 'Features',
'total_revenue' => 'Total revenue',
'active_reseller_package' => 'Active partner / agency package',
'remaining_events' => 'Remaining events',
'package_expires_at' => 'Package expires at',
'is_active' => 'Active',
'is_suspended' => 'Suspended',
'pending_deletion_at' => 'Deletion scheduled for',
'deletion_warning_sent_at' => 'Deletion warning sent at',
'anonymized_at' => 'Anonymized at',
'subscription_expires_at' => 'Subscription expires at',
'grace_period_ends_at' => 'Grace period ends at',
'max_photos_per_event' => 'Max photos per event',
'max_storage_mb' => 'Max storage (MB)',
'storage_used_mb' => 'Storage used',
'storage_remaining_mb' => 'Storage remaining',
'storage_usage_percent' => 'Storage usage',
'owner' => 'Owner',
'access_status' => 'Access status',
],
'sections' => [
'profile' => 'Profile',
'lifecycle' => 'Lifecycle',
'limits' => 'Limits',
'timeline' => 'Audit timeline',
],
'actions' => [
'adjust_credits' => 'Adjust bundle',
'adjust_credits_delta' => 'Event bundle delta (positive/negative)',
'adjust_credits_delta_hint' => 'Positive values add bundle, negative values deduct it.',
'adjust_credits_reason' => 'Internal note',
'adjust_credits_success_title' => 'Bundle updated',
'adjust_credits_success_body' => 'Bundle changed by :delta. New balance: :balance.',
'lifecycle' => 'Lifecycle',
'activate' => 'Activate',
'deactivate' => 'Deactivate',
'suspend' => 'Suspend',
'unsuspend' => 'Unsuspend',
'schedule_deletion' => 'Schedule deletion',
'schedule_deletion_success' => 'Deletion scheduled',
'cancel_deletion' => 'Cancel deletion',
'cancel_deletion_success' => 'Deletion schedule cleared',
'anonymize_now' => 'Anonymize now',
'anonymize_success' => 'Anonymization queued',
'send_warning' => 'Send warning email',
'send_warning_missing_title' => 'No contact email available',
'send_warning_missing_body' => 'No email address is available to send the warning.',
'update_limits' => 'Update limits',
'update_subscription_expires_at' => 'Update subscription expiry',
'set_grace_period' => 'Set grace period',
'clear_grace_period' => 'Clear grace period',
'lifecycle_controls' => 'Lifecycle controls',
'note' => 'Internal note',
],
'pages' => [
'overview' => 'Overview',
'lifecycle' => 'Lifecycle',
'edit' => 'Edit',
],
'status' => [
'active' => 'Active',
'inactive' => 'Inactive',
'suspended' => 'Suspended',
'expired' => 'Expired',
'grace' => 'Grace period',
'anonymized' => 'Anonymized',
],
'limits' => [
'unlimited' => 'Unlimited',
],
'timeline' => [
'title' => 'Event',
'details' => 'Details',
'status' => 'Status',
'occurred_at' => 'Occurred at',
'created' => 'Tenant created',
'created_details' => 'Tenant created in the system.',
'last_activity' => 'Last activity',
'last_activity_details' => 'Latest recorded tenant activity.',
'deletion_warning' => 'Deletion warning sent',
'deletion_warning_details' => 'Retention warning was sent.',
'deletion_scheduled' => 'Deletion scheduled',
'deletion_scheduled_details' => 'Deletion is scheduled.',
'anonymized' => 'Tenant anonymized',
'anonymized_details' => 'Tenant data anonymized.',
'notification_sent' => 'Notification sent',
'notification_failed' => 'Notification failed',
'grace_period_until' => 'Grace until :date',
'by' => 'By :name',
'events' => [
'activated' => 'Tenant activated',
'deactivated' => 'Tenant deactivated',
'suspended' => 'Tenant suspended',
'unsuspended' => 'Tenant unsuspended',
'deletion_scheduled' => 'Deletion scheduled',
'deletion_cancelled' => 'Deletion cancelled',
'anonymize_requested' => 'Anonymization requested',
'grace_period_set' => 'Grace period set',
'grace_period_cleared' => 'Grace period cleared',
'limits_updated' => 'Limits updated',
'subscription_expires_at_updated' => 'Subscription expiry updated',
],
'tone' => [
'success' => 'Success',
'warning' => 'Warning',
'danger' => 'Failed',
'info' => 'Info',
'muted' => 'Muted',
],
],
],
'purchase_history' => [
'fields' => [
'tenant' => 'Tenant',
'package' => 'Package',
'credits' => 'Event bundle',
'price' => 'Price',
'currency' => 'Currency',
'platform' => 'Platform',
'transaction_id' => 'Transaction ID',
'purchased_at' => 'Purchased at',
],
'filters' => [
'purchased_at' => 'Date range',
'platform' => 'Platform',
'currency' => 'Currency',
'tenant' => 'Tenant',
],
'actions' => [
'export' => 'Export',
],
'platforms' => [
'ios' => 'iOS',
'android' => 'Android',
'web' => 'Web',
'manual' => 'Manual',
],
'export_success' => 'Export ready. :count rows exported.',
],
'data_exports' => [
'navigation' => [
'label' => 'Data exports',
],
'sections' => [
'request' => 'Export request',
],
'fields' => [
'id' => '#',
'scope' => 'Scope',
'tenant' => 'Tenant',
'event' => 'Event',
'include_media' => 'Include raw media',
'status' => 'Status',
'size' => 'Size',
'created_at' => 'Requested',
'expires_at' => 'Expires',
],
'help' => [
'include_media' => 'Include original media files in the export archive.',
],
'scope' => [
'user' => 'User',
'tenant' => 'Tenant',
'event' => 'Event',
],
'status' => [
'pending' => 'Pending',
'processing' => 'Processing',
'ready' => 'Ready',
'failed' => 'Failed',
'canceled' => 'Canceled',
],
'actions' => [
'request' => 'Request export',
'download' => 'Download',
'retry' => 'Retry',
'cancel' => 'Cancel',
],
],
'retention_overrides' => [
'navigation' => [
'label' => 'Retention overrides',
],
'sections' => [
'override' => 'Retention hold',
'status' => 'Status',
],
'fields' => [
'id' => '#',
'scope' => 'Scope',
'tenant' => 'Tenant',
'event' => 'Event',
'reason' => 'Reason',
'note' => 'Note',
'created_by' => 'Created by',
'created_at' => 'Created',
'released_by' => 'Released by',
'released_at' => 'Released at',
'status' => 'Status',
],
'scope' => [
'tenant' => 'Tenant',
'event' => 'Event',
],
'status' => [
'active' => 'Active',
'released' => 'Released',
],
'actions' => [
'request' => 'Add hold',
'release' => 'Release hold',
],
],
'shell' => [
'tenant_admin_title' => 'Tenant Admin',
],
'errors' => [
'forbidden' => [
'title' => 'Access denied',
'message' => 'You do not have permission to access this area of the admin panel.',
'hint' => 'Please verify that your tenant subscription is active or contact support if you believe this is a mistake.',
'cta' => 'Return to start page',
],
],
];