diff --git a/client/src/App.jsx b/client/src/App.jsx
index b44fda1..60c8dfa 100644
--- a/client/src/App.jsx
+++ b/client/src/App.jsx
@@ -90,7 +90,6 @@ export default function App() {
{demoMode && isAuthenticated && }
-
} />
} />
@@ -137,7 +136,6 @@ export default function App() {
/>
} />
-
)
}
diff --git a/client/src/components/Layout/DemoBanner.jsx b/client/src/components/Layout/DemoBanner.jsx
index f27926e..ef215f4 100644
--- a/client/src/components/Layout/DemoBanner.jsx
+++ b/client/src/components/Layout/DemoBanner.jsx
@@ -1,32 +1,65 @@
import React, { useState, useEffect } from 'react'
-import { Info, X, Github, Shield, Key, Users, Database, ChevronDown, ChevronUp } from 'lucide-react'
+import { Info, Github, Shield, Key, Users, Database, ChevronDown, ChevronUp } from 'lucide-react'
+import { useTranslation } from '../../i18n'
+
+const texts = {
+ de: {
+ title: 'Demo-Modus',
+ resetInfo: 'Aenderungen werden stuendlich zurueckgesetzt',
+ nextReset: 'naechster Reset in ~{min} Min.',
+ moreInfo: 'Mehr Info',
+ lessInfo: 'Weniger',
+ description: 'Du nutzt die NOMAD Demo. Du kannst Reisen ansehen, bearbeiten und eigene erstellen — alles wird jede Stunde automatisch zurueckgesetzt.',
+ fullVersionTitle: 'Diese Funktionen sind in der Vollversion verfuegbar:',
+ features: [
+ 'API-Schluessel verwalten (Google Maps, Wetter)',
+ 'Benutzer & Rechte verwalten',
+ 'Automatische Backups & Wiederherstellung',
+ 'Registrierung & Sicherheitseinstellungen',
+ ],
+ selfHost: 'NOMAD ist Open Source — ',
+ selfHostLink: 'selbst hosten',
+ },
+ en: {
+ title: 'Demo Mode',
+ resetInfo: 'Changes are reset every hour',
+ nextReset: 'next reset in ~{min} min.',
+ moreInfo: 'More info',
+ lessInfo: 'Less',
+ description: 'You are using the NOMAD demo. You can view, edit and create trips — everything is automatically reset every hour.',
+ fullVersionTitle: 'These features are available in the full version:',
+ features: [
+ 'API key management (Google Maps, Weather)',
+ 'User & permission management',
+ 'Automatic backups & restore',
+ 'Registration & security settings',
+ ],
+ selfHost: 'NOMAD is open source — ',
+ selfHostLink: 'self-host it',
+ },
+}
+
+const featureIcons = [Key, Users, Database, Shield]
export default function DemoBanner() {
const [expanded, setExpanded] = useState(false)
const [minutesLeft, setMinutesLeft] = useState(null)
+ const { language } = useTranslation()
+ const t = texts[language] || texts.en
useEffect(() => {
- const update = () => {
- const now = new Date()
- setMinutesLeft(59 - now.getMinutes())
- }
+ const update = () => setMinutesLeft(59 - new Date().getMinutes())
update()
const interval = setInterval(update, 30000)
return () => clearInterval(interval)
}, [])
- const adminFeatures = [
- { icon: Key, text: 'API-Schluessel verwalten (Google Maps, Wetter)' },
- { icon: Users, text: 'Benutzer & Rechte verwalten' },
- { icon: Database, text: 'Automatische Backups & Wiederherstellung' },
- { icon: Shield, text: 'Registrierung & Sicherheitseinstellungen' },
- ]
+ const bannerHeight = expanded ? undefined : 36
return (
-
+
{/* Main banner bar */}
- Demo-Modus
+ {t.title}
·
- Aenderungen werden stuendlich zurueckgesetzt
+ {t.resetInfo}
{minutesLeft !== null && (
- (naechster Reset in ~{minutesLeft} Min.)
+ ({t.nextReset.replace('{min}', minutesLeft)})
)}
@@ -69,7 +101,7 @@ export default function DemoBanner() {
}}
>
{expanded ? : }
- {expanded ? 'Weniger' : 'Mehr Info'}
+ {expanded ? t.lessInfo : t.moreInfo}
@@ -80,25 +112,26 @@ export default function DemoBanner() {
borderBottom: '1px solid #fbbf24',
padding: '16px 24px',
fontFamily: "-apple-system, BlinkMacSystemFont, 'SF Pro Text', system-ui, sans-serif",
- boxShadow: '0 4px 12px rgba(0,0,0,0.08)',
}}>
- Du nutzt die NOMAD Demo. Du kannst Reisen ansehen, bearbeiten und eigene erstellen —
- alles wird jede Stunde automatisch zurueckgesetzt.
+ {t.description}
- Diese Funktionen sind in der Vollversion verfuegbar:
+ {t.fullVersionTitle}
- {adminFeatures.map(({ icon: Icon, text }) => (
-
-
- {text}
-
- ))}
+ {t.features.map((text, i) => {
+ const Icon = featureIcons[i]
+ return (
+
+
+ {text}
+
+ )
+ })}