// Temporary translation system until Docker rebuild const translations = { en: { navigation: { dashboard: 'Dashboard', detections: 'Detections', devices: 'Devices', alerts: 'Alerts', settings: 'Settings', logout: 'Logout', map: 'Map View' }, dashboard: { title: 'System Overview', online: 'Online', offline: 'Offline', inactive: 'Inactive', recentDetections: 'Recent Detections', systemHealth: 'System Health', connectedDevices: 'Connected Devices', activeAlerts: 'Active Alerts', totalDetections: 'Total Detections', noData: 'No data available', loading: 'Loading...', refreshData: 'Refresh Data', notificationsEnabled: 'Notifications Enabled', notificationsDisabled: 'Notifications Disabled', detectionHistory: 'Detection History', deviceStatus: 'Device Status', deviceActivity: 'Device Activity', deviceActivity24h: 'Device Activity (24h)', detectionsTimeline24h: 'Detections Timeline (24h)', lastHour: 'Last Hour', last24Hours: 'Last 24 Hours', thisWeek: 'This Week', connected: 'Connected', disconnected: 'Disconnected', healthy: 'Healthy', warning: 'Warning', critical: 'Critical', operational: 'Operational', maintenance: 'Maintenance', failed: 'Failed', pending: 'Pending', approved: 'Approved', rejected: 'Rejected', active: 'Active', disabled: 'Disabled', statistics: 'Statistics', overview: 'Overview', summary: 'Summary', quickStats: 'Quick Statistics', systemOverview: 'System Overview', recentActivity: 'Recent Activity', liveDetections: 'Live Detections', live: 'Live', noRecentActivity: 'No recent activity', noRecentDetections: 'No recent detections', droneDetected: 'Drone detected', heartbeatFrom: 'Heartbeat from', movementTracking: 'Movement Tracking', criticalAlerts: 'Critical Alerts', veryCloseApproaches: 'Very close approaches', highPriority: 'High Priority', approachingDrones: 'Approaching drones', mediumPriority: 'Medium Priority', movementChanges: 'Movement changes', totalTracked: 'Total Tracked', events: 'events', lastAlert: 'Last Alert', none: 'None' }, detections: { title: 'Drone Detections', description: 'History of all drone detections from your devices', noDetections: 'No detections found', loading: 'Loading detections...', timestamp: 'Timestamp', type: 'Type', confidence: 'Confidence', location: 'Location', device: 'Device', actions: 'Actions', searchPlaceholder: 'Search detections...', filterByType: 'Filter by type', filterByDevice: 'Filter by device', exportData: 'Export Data', viewDetails: 'View Details', showOnMap: 'Show on Map', highConfidence: 'High Confidence', mediumConfidence: 'Medium Confidence', lowConfidence: 'Low Confidence', filters: 'Filters', deviceId: 'Device ID', droneId: 'Drone ID', startDate: 'Start Date', endDate: 'End Date', clearFilters: 'Clear Filters', deviceIdPlaceholder: 'Enter device ID', droneIdPlaceholder: 'Enter drone ID', frequency: 'Frequency', rssi: 'RSSI', detectedAt: 'Detected At', unknown: 'Unknown', tryAdjustingFilters: 'Try adjusting your search filters.', previous: 'Previous', next: 'Next', showing: 'Showing', to: 'to', of: 'of', results: 'results' }, devices: { title: 'All Devices', description: 'Manage your UAM-ILS detection devices', noDevices: 'No devices', noDevicesDescription: 'Get started by adding your first drone detection device.', loading: 'Loading devices...', name: 'Name', status: 'Status', lastSeen: 'Last Seen', location: 'Location', actions: 'Actions', addDevice: 'Add Device', editDevice: 'Edit Device', deleteDevice: 'Delete Device', deviceDetails: 'Device Details', batteryLevel: 'Battery Level', signalStrength: 'Signal Strength', firmware: 'Firmware', ipAddress: 'IP Address', macAddress: 'MAC Address', approved: 'Approved', pending: 'Pending', pendingApproval: 'pending approval', allDevices: 'All Devices', pendingApprovalTab: 'Pending Approval', needsApproval: 'Needs Approval', approval: 'Approval', deviceId: 'Device ID', coordinates: 'Coordinates', signal: 'Signal', detections24h: 'Detections (24h)', approveDevice: 'Approve Device', reject: 'Reject', viewDetails: 'View Details', viewOnMap: 'View on Map', noDevicesFiltered: 'No devices match the current filter.', noDevicesPending: 'No devices are currently pending approval.', noDevicesApproved: 'No devices have been approved yet.', device: 'Device', unknown: 'Unknown', online: 'Online', offline: 'Offline', inactive: 'Inactive', confirmReject: 'Are you sure you want to reject this device?', errorRejecting: 'Error rejecting device:', errorDeleting: 'Error deleting device:', confirmDelete: 'Are you sure you want to delete this device? This action cannot be undone.', signalStrong: 'Strong', signalGood: 'Good', signalWeak: 'Weak', signalLost: 'Lost', deviceDetails: 'Device Details', unnamed: 'Unnamed', yes: 'Yes', lastHeartbeat: 'Last Heartbeat', approve: 'Approve', close: 'Close' }, alerts: { title: 'Alert Management', description: 'Configure and manage detection alerts', noAlerts: 'No alerts found', loading: 'Loading alerts...', type: 'Type', priority: 'Priority', status: 'Status', created: 'Created', actions: 'Actions', createAlert: 'Create Alert', editAlert: 'Edit Alert', deleteAlert: 'Delete Alert', alertName: 'Alert Name', alertDescription: 'Description', triggerConditions: 'Trigger Conditions', notificationSettings: 'Notification Settings', emailNotifications: 'Email Notifications', smsNotifications: 'SMS Notifications', webhookUrl: 'Webhook URL', highPriority: 'High Priority', mediumPriority: 'Medium Priority', lowPriority: 'Low Priority', active: 'Active', inactive: 'Inactive', totalAlerts24h: 'Total Alerts (24h)', sentSuccessfully: 'Sent Successfully', failed: 'Failed', pending: 'Pending', alertRules: 'Alert Rules', alertLogs: 'Alert Logs', noAlertRules: 'No alert rules', noAlertRulesDescription: 'Get started by creating your first alert rule.', createAlertRule: 'Create Alert Rule', noAlertLogs: 'No alert logs', noAlertLogsDescription: 'Alert logs will appear here when alerts are triggered.', name: 'Name', channels: 'Channels', conditions: 'Conditions', edit: 'Edit', delete: 'Delete', recipient: 'Recipient', rule: 'Rule', droneId: 'Drone ID', detection: 'Detection', message: 'Message', sentAt: 'Sent At', viewDetails: 'View Details', unknownRule: 'Unknown Rule', na: 'N/A', minDetections: 'Min detections', timeWindow: 'Time window', cooldown: 'Cooldown', minThreat: 'Min threat', droneTypes: 'Drone types', consumer: 'Consumer', orlan: 'Orlan', professional: 'Professional', racing: 'Racing', unknown: 'Unknown', critical: 'Critical', high: 'High', medium: 'Medium', low: 'Low' }, settings: { title: 'Settings', description: 'Configure your account and system preferences', profile: 'Profile', notifications: 'Notifications', system: 'System', account: 'Account Settings', security: 'Security Settings', preferences: 'Preferences', language: 'Language', timezone: 'Timezone', emailSettings: 'Email Settings', passwordSettings: 'Password Settings', twoFactorAuth: 'Two-Factor Authentication', apiKeys: 'API Keys', dataRetention: 'Data Retention', exportData: 'Export Data', deleteAccount: 'Delete Account', loading: 'Loading settings...', accessDenied: 'Access Denied', accessDeniedMessage: "You don't have permission to access tenant settings.", general: 'General', branding: 'Branding', authentication: 'Authentication', users: 'Users', generalInformation: 'General Information', tenantName: 'Tenant Name', tenantId: 'Tenant ID', authenticationProvider: 'Authentication Provider', companyName: 'Company Name', logoUrl: 'Or enter logo URL manually', primaryColor: 'Primary Color', secondaryColor: 'Secondary Color', save: 'Save', saving: 'Saving...', saveBranding: 'Save Branding', saveChanges: 'Save Changes', brandingUpdated: 'Branding updated successfully', brandingUpdateFailed: 'Failed to update branding', securityUpdated: 'Security settings updated successfully', securityUpdateFailed: 'Failed to update security settings', removeLogo: 'Remove Logo', changeLogo: 'Change Logo', confirmRemoveLogo: 'Are you sure you want to remove the current logo?', logoRemoved: 'Logo removed successfully', logoRemoveFailed: 'Failed to remove logo', // Security and permissions accessDenied: 'Access denied: Insufficient permissions', invalidTenant: 'Invalid tenant', tenantNotFound: 'Tenant not found', userNotMemberOfTenant: 'Access denied: User not member of tenant', authenticationRequired: 'Authentication required', logoUploadError: 'Failed to upload logo', logoRemovalError: 'Failed to remove logo', logoUploadSuccess: 'Logo uploaded successfully', logoRemovalSuccess: 'Logo removed successfully', noFileUploaded: 'No file uploaded', noLogoToRemove: 'No logo to remove', internalServerError: 'Internal server error', securityValidationFailed: 'Security validation failed', unauthorizedAccess: 'Unauthorized access attempt', tenantAccessDenied: 'Access denied for this tenant' }, auth: { login: 'Login', logout: 'Logout', username: 'Username', password: 'Password', email: 'Email', confirmPassword: 'Confirm Password', forgotPassword: 'Forgot Password?', signIn: 'Sign In', signUp: 'Sign Up', register: 'Register', signingIn: 'Signing in...', registering: 'Creating account...', rememberMe: 'Remember me', createAccount: 'Create Account', alreadyHaveAccount: 'Already have an account?', dontHaveAccount: "Don't have an account?", resetPassword: 'Reset Password', backToLogin: 'Back to Login' }, map: { title: 'Map View', description: 'Real-time detection locations and device status', loading: 'Loading map...', noDetections: 'No detections to display', deviceLocation: 'Device Location', detectionLocation: 'Detection Location', lastDetection: 'Last Detection', deviceOnline: 'Device Online', deviceOffline: 'Device Offline', zoomToLocation: 'Zoom to Location', showAllDevices: 'Show All Devices', showDetections: 'Show Detections', filterByTime: 'Filter by Time', realTimeUpdates: 'Real-time Updates', deviceStatus: 'Device Status', connectionStatus: 'Connection Status', lastHeartbeat: 'Last Heartbeat', recentDetections: 'Recent Detections', systemStatus: 'System Status', emergencyAlert: 'Emergency Alert', criticalThreat: 'Critical Threat', immediateAction: 'Immediate Action Required', multipleContacts: 'Multiple Contacts', noDevicesFound: 'No devices found', mapLegend: 'Map Legend', deviceDetecting: 'Active Detection', droneDetectionRings: 'Drone Detection Rings', ringsDescription: 'Rings show estimated detection range based on RSSI', orlanMilitary: 'Military-drone (Always Critical)', closeRange: 'Close Range (>-60dBm)', mediumRange: 'Medium Range (-60 to -70dBm)', farRange: 'Far Range (<-70dBm)', multipleDrones: 'Multiple Drones at Same Detector', differentColors: 'Different colors to distinguish drones', differentPatterns: 'Different dash patterns', droneLabels: 'Drone ID labels shown', positionOffsets: 'Slight position offsets for visibility', ringSize: 'Ring size = estimated distance from detector', showDroneDetections: 'Show Drone Detections', droneDetectionDetails: 'Drone Detection Details', live: 'LIVE', droneId: 'Drone ID', type: 'Type', rssi: 'RSSI', frequency: 'Frequency', detectionTimeline: 'Detection Timeline', firstDetected: 'First detected', latestDetection: 'Latest detection', currentDetection: 'Current Detection', confidence: 'Confidence', duration: 'Duration', detector: 'Detector', location: 'Location', realTimeAnalysis: 'Real-time Analysis', firstDetection: 'First detection', movementAnalysis: 'Movement Analysis', totalDetections: 'Total detections', signalStrengthTrend: 'Signal Strength Trend', lastDetections: 'Last 8 detections (oldest to newest)', approaching: 'APPROACHING', retreating: 'RETREATING', stablePosition: 'STABLE POSITION', rssiChange: 'RSSI change', over: 'over', minutes: 'minutes', instantTrend: 'Instant trend', strengthening: 'STRENGTHENING', weakening: 'WEAKENING', deviceName: 'Device', unknown: 'Unknown' }, movementAlerts: { title: 'Movement Alerts', allAlerts: 'All Alerts', critical: 'Critical', highPriority: 'High Priority', mediumPriority: 'Medium Priority', clearAll: 'Clear All', noAlerts: 'No movement alerts', noAlertsDescription: 'Drone movement patterns will appear here', droneDevice: 'Drone {droneId} • Device {deviceId}', droneType: 'Drone Type:', frequency: 'Frequency:', confidence: 'Confidence:', signalDuration: 'Signal Duration:', movementPattern: 'Movement Pattern:', pattern: 'Pattern:', speed: 'Speed:', distance: 'Distance:', trackingStats: 'Tracking Stats:', detectionsOverTime: '{count} detections over {time} minutes', recentRssiHistory: 'Recent RSSI History:', strengthening: 'strengthening', weakening: 'weakening', stable: 'stable', droneTypes: { djiMavic: 'DJI Mavic', racingDrone: 'Racing Drone', djiPhantom: 'DJI Phantom', fixedWing: 'Fixed Wing', surveillance: 'Surveillance', unknown: 'Unknown' } }, debug: { title: 'Debug Console', subtitle: 'Admin-only access to all detection data including drone type 0 (None)', debugInformation: 'Debug Information', totalNoneDetections: 'Total None detections: {count}', filters: 'Filters', droneType: 'Drone Type', deviceId: 'Device ID', resultsPerPage: 'Results per page', filterByDeviceId: 'Filter by device ID', allTypes: 'All Types', debugDetections: 'Debug Detections ({count})', noDebugData: 'No debug data', noDetectionsFound: 'No detections found matching the current filters.', idTime: 'ID / Time', device: 'Device', rssiFreq: 'RSSI / Freq', threatLevel: 'Threat Level', debug: 'Debug', actions: 'Actions', viewPayload: 'View Payload', deleteDetection: 'Delete Detection', droneTypeOptions: { none: '0 - None (Debug)', unknown: '1 - Unknown', orlan: '2 - Orlan', zala: '3 - Zala', eleron: '4 - Eleron', zalaLancet: '5 - Zala Lancet', lancet: '6 - Lancet', fpvCrossFire: '7 - FPV CrossFire', fpvElrs: '8 - FPV ELRS', maybeOrlan: '9 - Maybe Orlan', maybeZala: '10 - Maybe Zala', maybeLancet: '11 - Maybe Lancet', maybeEleron: '12 - Maybe Eleron', dji: '13 - DJI', supercam: '14 - Supercam', maybeSupercam: '15 - Maybe Supercam', reb: '16 - REB', cryptoOrlan: '17 - Crypto Orlan', djiEnterprise: '18 - DJI Enterprise' }, payloadViewer: { title: 'Debug Payload Viewer', detectionId: 'Detection ID:', timestamp: 'Timestamp:', deviceId: 'Device ID:', rawPayload: 'Raw Payload:', processedData: 'Processed Data:', noPayloadData: 'No raw payload data found for this detection', failedToFetch: 'Failed to fetch payload data' } }, alerts: { title: 'Alert Management', description: 'Manage alert rules and view alert activity', loading: 'Loading alerts...', rules: 'Rules', logs: 'Logs', stats: 'Stats', createRule: 'Create Rule', createAlert: 'Create Alert', createAlertRule: 'Create Alert Rule', editRule: 'Edit Rule', deleteRule: 'Delete Rule', ruleDetails: 'Rule Details', noRules: 'No alert rules configured', noAlertRules: 'No alert rules', noRulesDescription: 'Create your first alert rule to start monitoring drone activity.', noAlertRulesDescription: 'Create your first alert rule to start monitoring drone activity.', noLogs: 'No alert logs', noLogsDescription: 'Alert activity will appear here once rules are triggered.', name: 'Name', description: 'Description', priority: 'Priority', minDetections: 'Minimum Detections', timeWindow: 'Time Window (seconds)', cooldownPeriod: 'Cooldown Period (seconds)', alertChannels: 'Alert Channels', minThreatLevel: 'Minimum Threat Level', droneTypes: 'Drone Types', deviceIds: 'Device IDs', smsPhoneNumber: 'SMS Phone Number', webhookUrl: 'Webhook URL', enabled: 'Enabled', disabled: 'Disabled', active: 'Active', inactive: 'Inactive', triggered: 'Triggered', sentAt: 'Sent At', channel: 'Channel', channels: 'Channels', status: 'Status', retryCount: 'Retry Count', message: 'Message', detectionDetails: 'Detection Details', viewDetails: 'View Details', alertEvent: 'Alert Event', relatedAlerts: 'Related Alerts', showMore: 'Show {count} more alerts', showLess: 'Show less', alertRules: 'Alert Rules', alertLogs: 'Alert Logs', conditions: 'Conditions', actions: 'Actions', created: 'Created', cooldown: 'Cooldown', minThreat: 'Min Threat', totalAlerts24h: 'Total Alerts (24h)', sentSuccessfully: 'Sent Successfully', failed: 'Failed', pending: 'Pending', low: 'Low', medium: 'Medium', high: 'High', critical: 'Critical', priorities: { low: 'Low', medium: 'Medium', high: 'High', critical: 'Critical' }, channels: { sms: 'SMS', webhook: 'Webhook', email: 'Email' }, threatLevels: { low: 'Low', medium: 'Medium', high: 'High', critical: 'Critical' }, form: { nameRequired: 'Rule name is required', nameHelp: 'A descriptive name for this alert rule', descriptionHelp: 'Optional description of what this rule monitors', priorityHelp: 'Priority level for alerts generated by this rule', minDetectionsHelp: 'Minimum number of detections required to trigger alert', timeWindowHelp: 'Time window in seconds to count detections', cooldownHelp: 'Minimum time between alerts for the same rule', channelsRequired: 'At least one alert channel is required', channelsHelp: 'How alerts from this rule will be delivered', threatLevelHelp: 'Only trigger for detections with this threat level or higher', droneTypesHelp: 'Leave empty to monitor all drone types', deviceIdsHelp: 'Leave empty to monitor all devices', smsHelp: 'Phone number for SMS alerts (required if SMS channel selected)', webhookHelp: 'URL for webhook alerts (required if webhook channel selected)', updateFailed: 'Failed to update alert rule', editAlertRule: 'Edit Alert Rule', anyLevel: 'Any Level', monitoring: 'Monitoring', droneTypesFilter: 'Drone Types Filter', leaveEmptyAllTypes: 'Leave empty to monitor all drone types', alertChannelsLabel: 'Alert Channels', selectChannels: 'Select how alerts will be sent', smsPhoneLabel: 'SMS Phone Number', smsRequired: 'Required when SMS is selected', webhookUrlLabel: 'Webhook URL', webhookRequired: 'Required when webhook is selected' } }, register: { registrationDisabled: 'Registration is not enabled for this tenant', configLoadFailed: 'Failed to load authentication configuration', fillAllFields: 'Please fill in all required fields', passwordsMismatch: 'Passwords do not match', passwordTooShort: 'Password must be at least 8 characters long', passwordRequirements: 'Password must contain at least one lowercase letter, one uppercase letter, and one number', usernameInvalid: 'Username can only contain letters, numbers, dots, underscores, and hyphens', emailInvalid: 'Please enter a valid email address', phoneInvalid: 'Please enter a valid phone number' }, app: { title: 'UAM-ILS Drone Detection System', subtitle: 'Real-time Drone Monitoring', connectionStatus: 'Connection Status', connected: 'Connected', disconnected: 'Disconnected', systemStatus: 'System Status', online: 'Online', offline: 'Offline' }, common: { loading: 'Loading...', error: 'Error', success: 'Success', warning: 'Warning', info: 'Information', cancel: 'Cancel', save: 'Save', copy: 'Copy to Clipboard', delete: 'Delete', edit: 'Edit', view: 'View', close: 'Close', refresh: 'Refresh', search: 'Search', filter: 'Filter', export: 'Export', import: 'Import', add: 'Add', remove: 'Remove', update: 'Update', confirm: 'Confirm', yes: 'Yes', no: 'No', ok: 'OK', apply: 'Apply', reset: 'Reset', clear: 'Clear', all: 'All', none: 'None', selected: 'Selected', total: 'Total', page: 'Page', of: 'of', previous: 'Previous', next: 'Next', first: 'First', last: 'Last', date: 'Date', time: 'Time', status: 'Status', type: 'Type', name: 'Name', description: 'Description', filters: 'Filters', clearFilters: 'Clear Filters', refresh: 'Refresh', search: 'Search', loading: 'Loading...', error: 'Error', showing: 'Showing', to: 'to', results: 'results' }, management: { auditLogs: 'Security Audit Logs', totalLogs: 'Total Logs', successfulActions: 'Successful Actions', failedActions: 'Failed Actions', warnings: 'Warnings', critical: 'Critical Events', level: 'Level', action: 'Action', user: 'User', tenant: 'Tenant', message: 'Message', success: 'Success', ipAddress: 'IP Address', timestamp: 'Timestamp', dateRange: 'Date Range', searchPlaceholder: 'Search logs, users, or tenants...', noAuditLogs: 'No audit logs found', totalEntries: 'total entries', logoManagement: 'Logo Management Events', securityEvents: 'Security Events', auditTrail: 'Audit Trail', actions: 'Actions' } }, sv: { navigation: { dashboard: 'Översikt', detections: 'Detekteringar', devices: 'Enheter', alerts: 'Larm', settings: 'Inställningar', logout: 'Logga ut', map: 'Kartvy' }, dashboard: { title: 'Systemöversikt', online: 'Online', offline: 'Offline', inactive: 'Inaktiv', recentDetections: 'Senaste detekteringar', systemHealth: 'Systemhälsa', connectedDevices: 'Anslutna enheter', activeAlerts: 'Aktiva larm', totalDetections: 'Totala detekteringar', noData: 'Ingen data tillgänglig', loading: 'Laddar...', refreshData: 'Uppdatera data', notificationsEnabled: 'Aviseringar aktiverade', notificationsDisabled: 'Aviseringar inaktiverade', detectionHistory: 'Detekteringshistorik', deviceStatus: 'Enhetsstatus', deviceActivity: 'Enhetsaktivitet', deviceActivity24h: 'Enhetsaktivitet (24h)', detectionsTimeline24h: 'Detekteringshistorik (24h)', lastHour: 'Senaste timmen', last24Hours: 'Senaste 24 timmarna', thisWeek: 'Denna vecka', connected: 'Ansluten', disconnected: 'Frånkopplad', healthy: 'Frisk', warning: 'Varning', critical: 'Kritisk', operational: 'Operativ', maintenance: 'Underhåll', failed: 'Misslyckad', pending: 'Väntar', approved: 'Godkänd', rejected: 'Avvisad', active: 'Aktiv', disabled: 'Inaktiverad', statistics: 'Statistik', overview: 'Översikt', summary: 'Sammanfattning', quickStats: 'Snabbstatistik', systemOverview: 'Systemöversikt', recentActivity: 'Senaste aktivitet', liveDetections: 'Live-detekteringar', live: 'Live', noRecentActivity: 'Ingen senaste aktivitet', noRecentDetections: 'Inga senaste detekteringar', droneDetected: 'Drönare detekterad', heartbeatFrom: 'Signal från', movementTracking: 'Rörelsespårning', criticalAlerts: 'Kritiska larm', veryCloseApproaches: 'Mycket nära närmanden', highPriority: 'Hög prioritet', approachingDrones: 'Närmande drönare', mediumPriority: 'Medel prioritet', movementChanges: 'Rörelseförändringar', totalTracked: 'Totalt spårade', events: 'händelser', lastAlert: 'Senaste larm', none: 'Ingen' }, detections: { title: 'Drönaredetekteringar', description: 'Historik över alla drönaredetekteringar från dina enheter', noDetections: 'Inga detekteringar hittades', loading: 'Laddar detekteringar...', timestamp: 'Tidsstämpel', type: 'Typ', confidence: 'Säkerhet', location: 'Plats', device: 'Enhet', actions: 'Åtgärder', searchPlaceholder: 'Sök detekteringar...', filterByType: 'Filtrera efter typ', filterByDevice: 'Filtrera efter enhet', exportData: 'Exportera data', viewDetails: 'Visa detaljer', showOnMap: 'Visa på karta', highConfidence: 'Hög säkerhet', mediumConfidence: 'Medel säkerhet', lowConfidence: 'Låg säkerhet', filters: 'Filter', deviceId: 'Enhets-ID', droneId: 'Drönare-ID', startDate: 'Startdatum', endDate: 'Slutdatum', clearFilters: 'Rensa filter', deviceIdPlaceholder: 'Ange enhets-ID', droneIdPlaceholder: 'Ange drönare-ID', frequency: 'Frekvens', rssi: 'RSSI', detectedAt: 'Detekterad vid', unknown: 'Okänd', tryAdjustingFilters: 'Försök justera dina sökfilter.', previous: 'Föregående', next: 'Nästa', showing: 'Visar', to: 'till', of: 'av', results: 'resultat' }, devices: { title: 'Alla enheter', description: 'Hantera dina UAM-ILS detekteringsenheter', noDevices: 'Inga enheter', noDevicesDescription: 'Kom igång genom att lägga till din första drönaredetekteringsenhet.', loading: 'Laddar enheter...', name: 'Namn', status: 'Status', lastSeen: 'Senaste signalen', location: 'Plats', actions: 'Åtgärder', addDevice: 'Lägg till enhet', editDevice: 'Redigera enhet', deleteDevice: 'Ta bort enhet', deviceDetails: 'Enhetsdetaljer', batteryLevel: 'Batterinivå', signalStrength: 'Signalstyrka', firmware: 'Firmware', ipAddress: 'IP-adress', macAddress: 'MAC-adress', approved: 'Godkänd', pending: 'Väntande', pendingApproval: 'väntande godkännande', allDevices: 'Alla enheter', pendingApprovalTab: 'Väntande godkännande', needsApproval: 'Behöver godkännande', approval: 'Godkännande', deviceId: 'Enhets-ID', coordinates: 'Koordinater', signal: 'Signal', detections24h: 'Detekteringar (24h)', approveDevice: 'Godkänn enhet', reject: 'Avvisa', viewDetails: 'Visa detaljer', viewOnMap: 'Visa på karta', noDevicesFiltered: 'Inga enheter matchar det aktuella filtret.', noDevicesPending: 'Inga enheter väntar för närvarande på godkännande.', noDevicesApproved: 'Inga enheter har godkänts än.', device: 'Enhet', unknown: 'Okänd', online: 'Online', offline: 'Offline', inactive: 'Inaktiv', confirmReject: 'Är du säker på att du vill avvisa denna enhet?', errorRejecting: 'Fel vid avvisning av enhet:', errorDeleting: 'Fel vid borttagning av enhet:', confirmDelete: 'Är du säker på att du vill ta bort denna enhet? Denna åtgärd kan inte ångras.', signalStrong: 'Stark', signalGood: 'Bra', signalWeak: 'Svag', signalLost: 'Förlorad', deviceDetails: 'Enhetsdetaljer', unnamed: 'Namnlös', yes: 'Ja', lastHeartbeat: 'Senaste signalen', approve: 'Godkänn', close: 'Stäng' }, alerts: { title: 'Larmhantering', description: 'Konfigurera och hantera detekteringslarm', noAlerts: 'Inga larm hittades', loading: 'Laddar larm...', type: 'Typ', priority: 'Prioritet', status: 'Status', created: 'Skapad', actions: 'Åtgärder', createAlert: 'Skapa larm', editAlert: 'Redigera larm', deleteAlert: 'Ta bort larm', alertName: 'Larmnamn', alertDescription: 'Beskrivning', triggerConditions: 'Larmvillkor', notificationSettings: 'Aviseringsinställningar', emailNotifications: 'E-postaviseringar', smsNotifications: 'SMS-aviseringar', webhookUrl: 'Webhook URL', highPriority: 'Hög prioritet', mediumPriority: 'Medel prioritet', lowPriority: 'Låg prioritet', active: 'Aktiv', inactive: 'Inaktiv', totalAlerts24h: 'Totalt larm (24h)', sentSuccessfully: 'Skickade framgångsrikt', failed: 'Misslyckades', pending: 'Väntande', alertRules: 'Larmregler', alertLogs: 'Larmloggar', noAlertRules: 'Inga larmregler', noAlertRulesDescription: 'Kom igång genom att skapa din första larmregel.', createAlertRule: 'Skapa larmregel', noAlertLogs: 'Inga larmloggar', noAlertLogsDescription: 'Larmloggar kommer att visas här när larm utlöses.', name: 'Namn', channels: 'Kanaler', conditions: 'Villkor', edit: 'Redigera', delete: 'Ta bort', recipient: 'Mottagare', rule: 'Regel', droneId: 'Drönar-ID', detection: 'Detektion', message: 'Meddelande', sentAt: 'Skickat vid', viewDetails: 'Visa detaljer', unknownRule: 'Okänd regel', na: 'Ej tillämpligt', minDetections: 'Min detekteringar', timeWindow: 'Tidsfönster', cooldown: 'Nedkylning', minThreat: 'Min hot', droneTypes: 'Drönartyper', consumer: 'Konsument', orlan: 'Orlan', professional: 'Professionell', racing: 'Racing', unknown: 'Okänd', critical: 'Kritisk', high: 'Hög', medium: 'Medel', low: 'Låg' }, settings: { title: 'Inställningar', description: 'Konfigurera ditt konto och systempreferenser', profile: 'Profil', notifications: 'Aviseringar', system: 'System', account: 'Kontoinställningar', security: 'Säkerhetsinställningar', preferences: 'Preferenser', language: 'Språk', timezone: 'Tidszon', emailSettings: 'E-postinställningar', passwordSettings: 'Lösenordsinställningar', twoFactorAuth: 'Tvåfaktorsautentisering', apiKeys: 'API-nycklar', dataRetention: 'Datalagring', exportData: 'Exportera data', deleteAccount: 'Ta bort konto', loading: 'Laddar inställningar...', accessDenied: 'Åtkomst nekad', accessDeniedMessage: 'Du har inte behörighet att komma åt tenant-inställningar.', general: 'Allmänt', branding: 'Varumärke', authentication: 'Autentisering', users: 'Användare', generalInformation: 'Allmän information', tenantName: 'Tenant-namn', tenantId: 'Tenant-ID', authenticationProvider: 'Autentiseringsleverantör', companyName: 'Företagsnamn', logoUrl: 'Eller ange logotyp-URL manuellt', primaryColor: 'Primärfärg', secondaryColor: 'Sekundär färg', save: 'Spara', saving: 'Sparar...', saveBranding: 'Spara varumärke', saveChanges: 'Spara ändringar', brandingUpdated: 'Varumärke uppdaterat framgångsrikt', brandingUpdateFailed: 'Misslyckades med att uppdatera varumärke', securityUpdated: 'Säkerhetsinställningar uppdaterade framgångsrikt', securityUpdateFailed: 'Misslyckades med att uppdatera säkerhetsinställningar', removeLogo: 'Ta bort logotyp', changeLogo: 'Ändra logotyp', confirmRemoveLogo: 'Är du säker på att du vill ta bort den aktuella logotypen?', logoRemoved: 'Logotyp borttagen framgångsrikt', logoRemoveFailed: 'Misslyckades med att ta bort logotyp', // Säkerhet och behörigheter accessDenied: 'Åtkomst nekad: Otillräckliga behörigheter', invalidTenant: 'Ogiltig klient', tenantNotFound: 'Klient hittades inte', userNotMemberOfTenant: 'Åtkomst nekad: Användaren är inte medlem av klienten', authenticationRequired: 'Autentisering krävs', logoUploadError: 'Misslyckades med att ladda upp logotyp', logoRemovalError: 'Misslyckades med att ta bort logotyp', logoUploadSuccess: 'Logotyp uppladdad framgångsrikt', logoRemovalSuccess: 'Logotyp borttagen framgångsrikt', noFileUploaded: 'Ingen fil uppladdad', noLogoToRemove: 'Ingen logotyp att ta bort', internalServerError: 'Internt serverfel', securityValidationFailed: 'Säkerhetsvalidering misslyckades', unauthorizedAccess: 'Obehörigt åtkomstförsök', tenantAccessDenied: 'Åtkomst nekad för denna klient' }, auth: { login: 'Logga in', logout: 'Logga ut', username: 'Användarnamn', password: 'Lösenord', email: 'E-post', confirmPassword: 'Bekräfta lösenord', forgotPassword: 'Glömt lösenord?', signIn: 'Logga in', signUp: 'Registrera', register: 'Registrera', signingIn: 'Loggar in...', registering: 'Skapar konto...', rememberMe: 'Kom ihåg mig', createAccount: 'Skapa konto', alreadyHaveAccount: 'Har du redan ett konto?', dontHaveAccount: 'Har du inget konto?', resetPassword: 'Återställ lösenord', backToLogin: 'Tillbaka till inloggning' }, map: { title: 'Kartvy', description: 'Realtidsdetekteringsplatser och enhetsstatus', loading: 'Laddar karta...', noDetections: 'Inga detekteringar att visa', deviceLocation: 'Enhetsplats', detectionLocation: 'Detekteringsplats', lastDetection: 'Senaste detektion', deviceOnline: 'Enhet online', deviceOffline: 'Enhet offline', zoomToLocation: 'Zooma till plats', showAllDevices: 'Visa alla enheter', showDetections: 'Visa detekteringar', filterByTime: 'Filtrera efter tid', realTimeUpdates: 'Realtidsuppdateringar', deviceStatus: 'Enhetsstatus', connectionStatus: 'Anslutningsstatus', lastHeartbeat: 'Senaste signalen', recentDetections: 'Senaste detekteringar', systemStatus: 'Systemstatus', emergencyAlert: 'Nödlarm', criticalThreat: 'Kritiskt hot', immediateAction: 'Omedelbar åtgärd krävs', multipleContacts: 'Flera kontakter', noDevicesFound: 'Inga enheter hittades', mapLegend: 'Kartteckenförklaring', deviceDetecting: 'Aktiv detektion', droneDetectionRings: 'Drönardetekteringsringar', ringsDescription: 'Ringar visar uppskattad detekteringsräckvidd baserat på RSSI', orlanMilitary: 'Militärdrönare (Alltid kritisk)', closeRange: 'Närområde (>-60dBm)', mediumRange: 'Medelområde (-60 till -70dBm)', farRange: 'Långdistans (<-70dBm)', multipleDrones: 'Flera drönare vid samma detektor', differentColors: 'Olika färger för att skilja drönare åt', differentPatterns: 'Olika streckmönster', droneLabels: 'Drönar-ID-etiketter visas', positionOffsets: 'Lätta positionsförskjutningar för synlighet', ringSize: 'Ringstorlek = uppskattad distans från detektor', showDroneDetections: 'Visa drönardetekteringar', droneDetectionDetails: 'Drönardetekteringsdetaljer', live: 'LIVE', droneId: 'Drönar-ID', type: 'Typ', rssi: 'RSSI', frequency: 'Frekvens', detectionTimeline: 'Detekteringstidslinje', firstDetected: 'Först detekterad', latestDetection: 'Senaste detektion', currentDetection: 'Aktuell detektion', confidence: 'Konfidensgrad', duration: 'Varaktighet', detector: 'Detektor', location: 'Plats', realTimeAnalysis: 'Realtidsanalys', firstDetection: 'Första detektion', movementAnalysis: 'Rörelseanalys', totalDetections: 'Totalt antal detektioner', signalStrengthTrend: 'Signalstyrketrend', lastDetections: 'Senaste 8 detektioner (äldsta till nyaste)', approaching: 'NÄRMAR SIG', retreating: 'DRAR SIG TILLBAKA', stablePosition: 'STABIL POSITION', rssiChange: 'RSSI-förändring', over: 'över', minutes: 'minuter', instantTrend: 'Omedelbar trend', strengthening: 'FÖRSTÄRKNING', weakening: 'FÖRSVAGNING', deviceName: 'Enhet', unknown: 'Okänd' }, movementAlerts: { title: 'Rörelselarm', allAlerts: 'Alla larm', critical: 'Kritisk', highPriority: 'Hög prioritet', mediumPriority: 'Medel prioritet', clearAll: 'Rensa alla', noAlerts: 'Inga rörelselarm', noAlertsDescription: 'Drönarrörelsemönster kommer att visas här', droneDevice: 'Drönare {droneId} • Enhet {deviceId}', droneType: 'Drönartyp:', frequency: 'Frekvens:', confidence: 'Säkerhet:', signalDuration: 'Signallängd:', movementPattern: 'Rörelsemönster:', pattern: 'Mönster:', speed: 'Hastighet:', distance: 'Avstånd:', trackingStats: 'Spårningsstatistik:', detectionsOverTime: '{count} detekteringar över {time} minuter', recentRssiHistory: 'Senaste RSSI-historik:', strengthening: 'förstärks', weakening: 'försvagas', stable: 'stabil', droneTypes: { djiMavic: 'DJI Mavic', racingDrone: 'Racingdrönare', djiPhantom: 'DJI Phantom', fixedWing: 'Fast vinge', surveillance: 'Övervakning', unknown: 'Okänd' } }, debug: { title: 'Felsökningskonsol', subtitle: 'Endast admin-åtkomst till all detekteringsdata inklusive drönartyp 0 (Ingen)', debugInformation: 'Felsökningsinformation', totalNoneDetections: 'Totalt antal Ingen-detekteringar: {count}', filters: 'Filter', droneType: 'Drönartyp', deviceId: 'Enhets-ID', resultsPerPage: 'Resultat per sida', filterByDeviceId: 'Filtrera efter enhets-ID', allTypes: 'Alla typer', debugDetections: 'Felsökningsdetekteringar ({count})', noDebugData: 'Ingen felsökningsdata', noDetectionsFound: 'Inga detekteringar hittades som matchar nuvarande filter.', idTime: 'ID / Tid', device: 'Enhet', rssiFreq: 'RSSI / Frekv', threatLevel: 'Hotnivå', debug: 'Felsökning', actions: 'Åtgärder', viewPayload: 'Visa nyttolast', deleteDetection: 'Ta bort detektion', droneTypeOptions: { none: '0 - Ingen (Felsökning)', unknown: '1 - Okänd', orlan: '2 - Orlan', zala: '3 - Zala', eleron: '4 - Eleron', zalaLancet: '5 - Zala Lancet', lancet: '6 - Lancet', fpvCrossFire: '7 - FPV CrossFire', fpvElrs: '8 - FPV ELRS', maybeOrlan: '9 - Kanske Orlan', maybeZala: '10 - Kanske Zala', maybeLancet: '11 - Kanske Lancet', maybeEleron: '12 - Kanske Eleron', dji: '13 - DJI', supercam: '14 - Supercam', maybeSupercam: '15 - Kanske Supercam', reb: '16 - REB', cryptoOrlan: '17 - Krypto Orlan', djiEnterprise: '18 - DJI Enterprise' }, payloadViewer: { title: 'Felsökningsnyttolastvisare', detectionId: 'Detektions-ID:', timestamp: 'Tidsstämpel:', deviceId: 'Enhets-ID:', rawPayload: 'Rå nyttolast:', processedData: 'Bearbetad data:', noPayloadData: 'Ingen rå nyttolastdata hittades för denna detektion', failedToFetch: 'Misslyckades med att hämta nyttolastdata' } }, alerts: { title: 'Larmhantering', description: 'Hantera larmregler och visa larmaktivitet', loading: 'Laddar larm...', rules: 'Regler', logs: 'Loggar', stats: 'Statistik', createRule: 'Skapa regel', createAlert: 'Skapa larm', createAlertRule: 'Skapa larmregel', editRule: 'Redigera regel', deleteRule: 'Ta bort regel', ruleDetails: 'Regeldetaljer', noRules: 'Inga larmregler konfigurerade', noAlertRules: 'Inga larmregler', noRulesDescription: 'Skapa din första larmregel för att börja övervaka drönaraktivitet.', noAlertRulesDescription: 'Skapa din första larmregel för att börja övervaka drönaraktivitet.', noLogs: 'Inga larmloggar', noLogsDescription: 'Larmaktivitet kommer att visas här när regler utlöses.', name: 'Namn', description: 'Beskrivning', priority: 'Prioritet', minDetections: 'Minsta antal detekteringar', timeWindow: 'Tidsfönster (sekunder)', cooldownPeriod: 'Nedkylningsperiod (sekunder)', alertChannels: 'Larmkanaler', minThreatLevel: 'Lägsta hotnivå', droneTypes: 'Drönartyper', deviceIds: 'Enhets-ID:n', smsPhoneNumber: 'SMS-telefonnummer', webhookUrl: 'Webhook-URL', enabled: 'Aktiverad', disabled: 'Inaktiverad', active: 'Aktiv', inactive: 'Inaktiv', triggered: 'Utlöst', sentAt: 'Skickat vid', channel: 'Kanal', channels: 'Kanaler', status: 'Status', retryCount: 'Antal återförsök', message: 'Meddelande', detectionDetails: 'Detekteringsdetaljer', viewDetails: 'Visa detaljer', alertEvent: 'Larmhändelse', relatedAlerts: 'Relaterade larm', showMore: 'Visa {count} fler larm', showLess: 'Visa mindre', alertRules: 'Larmregler', alertLogs: 'Larmloggar', conditions: 'Villkor', actions: 'Åtgärder', created: 'Skapad', cooldown: 'Nedkylning', minThreat: 'Min hot', totalAlerts24h: 'Totala larm (24h)', sentSuccessfully: 'Skickade framgångsrikt', failed: 'Misslyckades', pending: 'Väntande', low: 'Låg', medium: 'Medel', high: 'Hög', critical: 'Kritisk', priorities: { low: 'Låg', medium: 'Medel', high: 'Hög', critical: 'Kritisk' }, channels: { sms: 'SMS', webhook: 'Webhook', email: 'E-post' }, threatLevels: { low: 'Låg', medium: 'Medel', high: 'Hög', critical: 'Kritisk' }, form: { nameRequired: 'Regelnamn krävs', nameHelp: 'Ett beskrivande namn för denna larmregel', descriptionHelp: 'Valfri beskrivning av vad denna regel övervakar', priorityHelp: 'Prioritetsnivå för larm genererade av denna regel', minDetectionsHelp: 'Minsta antal detekteringar som krävs för att utlösa larm', timeWindowHelp: 'Tidsfönster i sekunder för att räkna detekteringar', cooldownHelp: 'Minimitid mellan larm för samma regel', channelsRequired: 'Minst en larmkanal krävs', channelsHelp: 'Hur larm från denna regel kommer att levereras', threatLevelHelp: 'Utlös endast för detekteringar med denna hotnivå eller högre', droneTypesHelp: 'Lämna tomt för att övervaka alla drönartyper', deviceIdsHelp: 'Lämna tomt för att övervaka alla enheter', smsHelp: 'Telefonnummer för SMS-larm (krävs om SMS-kanal är vald)', webhookHelp: 'URL för webhook-larm (krävs om webhook-kanal är vald)', updateFailed: 'Misslyckades med att uppdatera larmregel', editAlertRule: 'Redigera larmregel', anyLevel: 'Alla nivåer', monitoring: 'Övervakning', droneTypesFilter: 'Drönartypsfilter', leaveEmptyAllTypes: 'Lämna tomt för att övervaka alla drönartyper', alertChannelsLabel: 'Larmkanaler', selectChannels: 'Välj hur larm kommer att skickas', smsPhoneLabel: 'SMS-telefonnummer', smsRequired: 'Krävs när SMS är valt', webhookUrlLabel: 'Webhook-URL', webhookRequired: 'Krävs när webhook är valt' } }, register: { registrationDisabled: 'Registrering är inte aktiverad för denna klient', configLoadFailed: 'Misslyckades med att ladda autentiseringskonfiguration', fillAllFields: 'Vänligen fyll i alla obligatoriska fält', passwordsMismatch: 'Lösenorden stämmer inte överens', passwordTooShort: 'Lösenordet måste vara minst 8 tecken långt', passwordRequirements: 'Lösenordet måste innehålla minst en liten bokstav, en stor bokstav och en siffra', usernameInvalid: 'Användarnamn kan bara innehålla bokstäver, siffror, punkter, understreck och bindestreck', emailInvalid: 'Vänligen ange en giltig e-postadress', phoneInvalid: 'Vänligen ange ett giltigt telefonnummer' }, app: { title: 'UAM-ILS Drönardetekteringssystem', subtitle: 'Realtids drönarövervakning', connectionStatus: 'Anslutningsstatus', connected: 'Ansluten', disconnected: 'Frånkopplad', systemStatus: 'Systemstatus', online: 'Online', offline: 'Offline' }, common: { loading: 'Laddar...', error: 'Fel', success: 'Framgång', warning: 'Varning', info: 'Information', cancel: 'Avbryt', save: 'Spara', copy: 'Kopiera till urklipp', delete: 'Ta bort', edit: 'Redigera', view: 'Visa', add: 'Lägg till', update: 'Uppdatera', create: 'Skapa', remove: 'Ta bort', close: 'Stäng', open: 'Öppna', back: 'Tillbaka', continue: 'Fortsätt', submit: 'Skicka', confirm: 'Bekräfta', yes: 'Ja', no: 'Nej', ok: 'OK', apply: 'Tillämpa', reset: 'Återställ', clear: 'Rensa', all: 'Alla', none: 'Ingen', selected: 'Vald', total: 'Totalt', page: 'Sida', of: 'av', previous: 'Föregående', next: 'Nästa', first: 'Första', last: 'Sista', date: 'Datum', time: 'Tid', status: 'Status', type: 'Typ', name: 'Namn', description: 'Beskrivning', filters: 'Filter', clearFilters: 'Rensa filter', refresh: 'Uppdatera', search: 'Sök', showing: 'Visar', to: 'till', results: 'resultat' }, management: { auditLogs: 'Säkerhetsgranskningsloggar', totalLogs: 'Totala loggar', successfulActions: 'Lyckade åtgärder', failedActions: 'Misslyckade åtgärder', warnings: 'Varningar', critical: 'Kritiska händelser', level: 'Nivå', action: 'Åtgärd', user: 'Användare', tenant: 'Klient', message: 'Meddelande', success: 'Framgång', ipAddress: 'IP-adress', timestamp: 'Tidsstämpel', dateRange: 'Datumintervall', searchPlaceholder: 'Sök loggar, användare eller klienter...', noAuditLogs: 'Inga granskningsloggar hittades', totalEntries: 'totala poster', logoManagement: 'Logotyphanteringshändelser', securityEvents: 'Säkerhetshändelser', auditTrail: 'Granskningsspår', view: 'Visa', close: 'Stäng', refresh: 'Uppdatera', search: 'Sök', filter: 'Filtrera', export: 'Exportera', import: 'Importera', add: 'Lägg till', remove: 'Ta bort', update: 'Uppdatera', confirm: 'Bekräfta', yes: 'Ja', no: 'Nej', ok: 'OK', apply: 'Tillämpa', reset: 'Återställ', clear: 'Rensa', all: 'Alla', none: 'Inga', selected: 'Valda', total: 'Totalt', page: 'Sida', of: 'av', previous: 'Föregående', next: 'Nästa', first: 'Första', last: 'Sista', date: 'Datum', time: 'Tid', status: 'Status', type: 'Typ', name: 'Namn', description: 'Beskrivning', actions: 'Åtgärder' } } }; let currentLanguage = localStorage.getItem('language') || 'en'; export const t = (key) => { const keys = key.split('.'); let value = translations[currentLanguage]; for (const k of keys) { value = value?.[k]; } return value || key; }; export const changeLanguage = (lang) => { currentLanguage = lang; localStorage.setItem('language', lang); // Trigger a page refresh to update all components window.location.reload(); }; export const getCurrentLanguage = () => currentLanguage; export const useTranslation = () => { return { t }; };