diff --git a/package.json b/package.json index 2f6d359e..016ed381 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,12 @@ "dependencies": { "@splidejs/react-splide": "^0.7.12", "@tanstack/react-router": "^1.170.15", + "i18next": "^26.1.0", "lottie-react": "^2.4.1", "lucide-react": "^1.18.0", "react": "^19.2.7", "react-dom": "^19.2.7", + "react-i18next": "^17.0.7", "react-markdown": "^10.1.0", "react-player": "^3.4.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b658047c..cc64f15f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@tanstack/react-router': specifier: ^1.170.15 version: 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + i18next: + specifier: ^26.1.0 + version: 26.1.0(typescript@5.9.3) lottie-react: specifier: ^2.4.1 version: 2.4.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -26,6 +29,9 @@ importers: react-dom: specifier: ^19.2.7 version: 19.2.7(react@19.2.7) + react-i18next: + specifier: ^17.0.7 + version: 17.0.7(i18next@26.1.0(typescript@5.9.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3) react-markdown: specifier: ^10.1.0 version: 10.1.0(@types/react@19.2.17)(react@19.2.7) @@ -239,6 +245,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} @@ -1522,9 +1532,20 @@ packages: html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + i18next@26.1.0: + resolution: {integrity: sha512-dIU6td04DvQuIqVst5S9g0GviTmhZ0DYD4b9ociVGJmuCa5vZ2de/t+Enf4olvj87mF8Y2lwjNQBwC9QZsvzKQ==} + peerDependencies: + typescript: ^5 || ^6 + peerDependenciesMeta: + typescript: + optional: true + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1922,6 +1943,22 @@ packages: peerDependencies: react: ^19.2.7 + react-i18next@17.0.7: + resolution: {integrity: sha512-rwtPXsb/zwzDafN+gytcjF5YnqGQQIRmCQ6DctBC1VSipRB8GD/MWEVrFP42vjMyuYydxWxM8CZRt+yiNuuoHg==} + peerDependencies: + i18next: '>= 26.0.10' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + typescript: ^5 || ^6 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -2187,6 +2224,10 @@ packages: yaml: optional: true + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + weakmap-polyfill@2.0.4: resolution: {integrity: sha512-ZzxBf288iALJseijWelmECm/1x7ZwQn3sMYIkDr2VvZp7r6SEKuT8D0O9Wiq6L9Nl5mazrOMcmiZE/2NCenaxw==} engines: {node: '>=8.10.0'} @@ -2454,6 +2495,8 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/runtime@7.29.2': {} + '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -3721,8 +3764,16 @@ snapshots: html-entities@2.6.0: {} + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + html-url-attributes@3.0.1: {} + i18next@26.1.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + ignore@5.3.2: {} ignore@7.0.5: {} @@ -4208,6 +4259,17 @@ snapshots: react: 19.2.7 scheduler: 0.27.0 + react-i18next@17.0.7(i18next@26.1.0(typescript@5.9.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.29.2 + html-parse-stringify: 3.0.1 + i18next: 26.1.0(typescript@5.9.3) + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + react-dom: 19.2.7(react@19.2.7) + typescript: 5.9.3 + react-is@16.13.1: {} react-markdown@10.1.0(@types/react@19.2.17)(react@19.2.7): @@ -4500,6 +4562,8 @@ snapshots: tsx: 4.21.0 yaml: 2.4.5 + void-elements@3.1.0: {} + weakmap-polyfill@2.0.4: {} webpack-virtual-modules@0.6.2: {} diff --git a/src/data/architectureSteps.ts b/src/data/architectureSteps.ts index 1cf1ab96..11b86ae3 100644 --- a/src/data/architectureSteps.ts +++ b/src/data/architectureSteps.ts @@ -10,26 +10,26 @@ interface ArchitectureStep { export const architectureSteps: ArchitectureStep[] = [ { - label: 'Sensor', - description: 'Misst Bodenfeuchte am Baum', + label: 'data.architectureSteps.sensor.label', + description: 'data.architectureSteps.sensor.description', icon: Radio, color: 'green-dark', }, { - label: 'Gateway', - description: 'LoRaWAN Übertragung', + label: 'data.architectureSteps.gateway.label', + description: 'data.architectureSteps.gateway.description', icon: Wifi, color: 'green-light', }, { - label: 'Backend', - description: 'Datenverarbeitung & Analyse', + label: 'data.architectureSteps.backend.label', + description: 'data.architectureSteps.backend.description', icon: Server, color: 'green-middle', }, { - label: 'Dashboard', - description: 'Visualisierung & Tourenplanung', + label: 'data.architectureSteps.dashboard.label', + description: 'data.architectureSteps.dashboard.description', icon: LayoutDashboard, color: 'green-dark', }, diff --git a/src/data/challengeFigures.ts b/src/data/challengeFigures.ts index 23682340..12d20be8 100644 --- a/src/data/challengeFigures.ts +++ b/src/data/challengeFigures.ts @@ -6,21 +6,18 @@ interface ChallengeFigure { export const challengeFigures: ChallengeFigure[] = [ { - value: '50.000', - unit: 'Liter / Jahr', - description: - 'Wasser werden pro mittelgroße Kommune jährlich ausgebracht, ohne Datengrundlage, ohne bedarfsgerechte Steuerung.', + value: 'data.challengeFigures.water.value', + unit: 'data.challengeFigures.water.unit', + description: 'data.challengeFigures.water.description', }, { - value: '1.700 €', - unit: 'pro Baum', - description: - 'kostet ein einzelner Straßenbaum. Ein vermeidbarer Totalverlust durch fehlende bedarfsgerechte Bewässerung finanziert Jahre Sensorbetrieb.', + value: 'data.challengeFigures.tree.value', + unit: 'data.challengeFigures.tree.unit', + description: 'data.challengeFigures.tree.description', }, { - value: 'bis 60.000 €', - unit: 'pro Beet', - description: - 'kann ein komplettes Straßenbeet kosten, inklusive Tiefbau, Substrat und Infrastruktur.', + value: 'data.challengeFigures.bed.value', + unit: 'data.challengeFigures.bed.unit', + description: 'data.challengeFigures.bed.description', }, ] diff --git a/src/data/governancePillars.ts b/src/data/governancePillars.ts index 6e1bff62..15778968 100644 --- a/src/data/governancePillars.ts +++ b/src/data/governancePillars.ts @@ -10,45 +10,39 @@ interface GovernancePillar { export const governancePillars: GovernancePillar[] = [ { - category: 'Lizenz', - title: 'AGPL-3.0-only', - description: - 'Lizenziert unter der AGPL. Finanziert im Rahmen des Landesprogramms „Offene Innovation" des DigitalHub.SH Schleswig-Holstein.', + category: 'data.governancePillars.license.category', + title: 'data.governancePillars.license.title', + description: 'data.governancePillars.license.description', icon: Shield, }, { - category: 'Souveränität', - title: 'Digitale Souveränität', - description: - 'Keine Abhängigkeit von proprietären Plattformen. Kommunen behalten die Kontrolle über ihre Daten und Infrastruktur. Kein Vendor-Lock-in.', + category: 'data.governancePillars.sovereignty.category', + title: 'data.governancePillars.sovereignty.title', + description: 'data.governancePillars.sovereignty.description', icon: Lock, }, { - category: 'Modularität', - title: 'Plugin-System', - description: - 'Modulare Erweiterungen für kommunenspezifische Anpassungen ohne Änderung der Kernsoftware. Import-Plugins für Baumkataster, CSV, Datenbanken.', + category: 'data.governancePillars.modularity.category', + title: 'data.governancePillars.modularity.title', + description: 'data.governancePillars.modularity.description', icon: Puzzle, }, { - category: 'Integration', - title: 'API-first', - description: - 'Offene Schnittstellen für Integration in kommunale IT-Landschaften. Anbindung an IoT-Hubs und Open-Data-Portale.', + category: 'data.governancePillars.integration.category', + title: 'data.governancePillars.integration.title', + description: 'data.governancePillars.integration.description', icon: Plug, }, { - category: 'Community', - title: 'Nachnutzung & Community', - description: - 'Quellcode und Dokumentation öffentlich auf GitHub. Andere Kommunen können die Lösung nachnutzen und anpassen.', + category: 'data.governancePillars.community.category', + title: 'data.governancePillars.community.title', + description: 'data.governancePillars.community.description', icon: Users, }, { - category: 'Wirtschaftlichkeit', - title: 'Kosteneffizienz', - description: - 'Keine Lizenzkosten. Geschäftsmodell basiert auf Dienstleistungen: Hosting, Anpassung, Sensorvertrieb. Regionale Wertschöpfung in SH.', + category: 'data.governancePillars.efficiency.category', + title: 'data.governancePillars.efficiency.title', + description: 'data.governancePillars.efficiency.description', icon: PiggyBank, }, ] diff --git a/src/data/processSteps.ts b/src/data/processSteps.ts index 44a4f4d6..654bfdf3 100644 --- a/src/data/processSteps.ts +++ b/src/data/processSteps.ts @@ -11,42 +11,37 @@ interface ProcessStep { export const steps: ProcessStep[] = [ { - label: 'Sensoren installieren', - shortName: 'Installation', - description: - 'Bodenfeuchtesensoren werden an ausgewählten Bäumen angebracht – schnell, unkompliziert und wartungsarm.', + label: 'data.processSteps.installSensors.label', + shortName: 'data.processSteps.installSensors.shortName', + description: 'data.processSteps.installSensors.description', icon: Radio, color: 'green-dark', }, { - label: 'Echtzeitdaten erfassen', - shortName: 'Daten', - description: - 'Die Sensoren messen kontinuierlich die Bodenfeuchtigkeit und übertragen die Werte automatisch ins System.', + label: 'data.processSteps.collectRealtimeData.label', + shortName: 'data.processSteps.collectRealtimeData.shortName', + description: 'data.processSteps.collectRealtimeData.description', icon: Activity, color: 'green-light', }, { - label: 'Bewässerungsbedarf erkennen', - shortName: 'Analyse', - description: - 'Das Dashboard zeigt dir auf einen Blick, welche Bäume Wasser brauchen – priorisiert nach Dringlichkeit.', + label: 'data.processSteps.detectWateringNeed.label', + shortName: 'data.processSteps.detectWateringNeed.shortName', + description: 'data.processSteps.detectWateringNeed.description', icon: LayoutDashboard, color: 'green-middle', }, { - label: 'Optimierte Routen planen', - shortName: 'Planung', - description: - 'Green Ecolution berechnet die effizienteste Tour für dein Team – weniger Fahrzeit, mehr Bewässerung.', + label: 'data.processSteps.planOptimizedRoutes.label', + shortName: 'data.processSteps.planOptimizedRoutes.shortName', + description: 'data.processSteps.planOptimizedRoutes.description', icon: Route, color: 'green-light', }, { - label: 'Bewässern und auswerten', - shortName: 'Umsetzung', - description: - 'Dein Team fährt die optimierte Route. Danach siehst du genau, wie viel Wasser wo eingesetzt wurde.', + label: 'data.processSteps.waterAndEvaluate.label', + shortName: 'data.processSteps.waterAndEvaluate.shortName', + description: 'data.processSteps.waterAndEvaluate.description', icon: Droplets, color: 'green-dark', }, diff --git a/src/data/roadmapItems.ts b/src/data/roadmapItems.ts index 01c83ba8..caf156ad 100644 --- a/src/data/roadmapItems.ts +++ b/src/data/roadmapItems.ts @@ -6,29 +6,28 @@ interface RoadmapItem { export const roadmapItems: RoadmapItem[] = [ { - title: 'Mobile App mit QR-Scan', - description: 'Sensor-Setup per QR-Code und GPS direkt vor Ort am Baum', + title: 'data.roadmapItems.mobileApp.title', + description: 'data.roadmapItems.mobileApp.description', status: 'in-progress', }, { - title: 'Eigene Sensor-Firmware', - description: 'Vollständig selbst entwickelte Firmware für maximale Kontrolle und Anpassbarkeit', + title: 'data.roadmapItems.sensorFirmware.title', + description: 'data.roadmapItems.sensorFirmware.description', status: 'planned', }, { - title: 'Benutzer- und Rollenkonzept', - description: - 'Feingranulare Rechteverwaltung für Mitarbeitende, Dienstleister und Partnerkommunen', + title: 'data.roadmapItems.roles.title', + description: 'data.roadmapItems.roles.description', status: 'planned', }, { - title: 'Open-Data-Export', - description: 'Anbindung an das Open-Data-Portal des Landes Schleswig-Holstein', + title: 'data.roadmapItems.openData.title', + description: 'data.roadmapItems.openData.description', status: 'planned', }, { - title: 'Weitere Grünflächentypen', - description: 'Erweiterung auf Beete, Stauden und Parks über Bäume hinaus', + title: 'data.roadmapItems.greenSpaceTypes.title', + description: 'data.roadmapItems.greenSpaceTypes.description', status: 'planned', }, ] diff --git a/src/data/sensorSpecs.ts b/src/data/sensorSpecs.ts index 098c56fb..b2d213a9 100644 --- a/src/data/sensorSpecs.ts +++ b/src/data/sensorSpecs.ts @@ -13,25 +13,25 @@ interface SensorFeature { } export const sensorSpecs: SensorSpec[] = [ - { value: '3', label: 'Messtiefen' }, - { value: 'LoRaWAN', label: 'Funknetz' }, - { value: '3+', label: 'Jahre Batterie' }, + { value: '3', label: 'data.sensorSpecs.specs.depths' }, + { value: 'LoRaWAN', label: 'data.sensorSpecs.specs.network' }, + { value: '3+', label: 'data.sensorSpecs.specs.battery' }, ] export const sensorFeatures: SensorFeature[] = [ { - label: 'Bodenfeuchte', - description: 'Volumetrische Messung der Bodenfeuchtigkeit in mehreren Tiefen', + label: 'data.sensorSpecs.features.soilMoisture.label', + description: 'data.sensorSpecs.features.soilMoisture.description', icon: Droplets, }, { - label: 'Temperatur', - description: 'Erfassung der Bodentemperatur für präzise Bewässerungsempfehlungen', + label: 'data.sensorSpecs.features.temperature.label', + description: 'data.sensorSpecs.features.temperature.description', icon: Thermometer, }, { - label: 'Bodenwasserspannung', - description: 'Messung der Saugspannung zur Bestimmung der Wasserverfügbarkeit', + label: 'data.sensorSpecs.features.waterTension.label', + description: 'data.sensorSpecs.features.waterTension.description', icon: Gauge, }, ] diff --git a/src/data/workflowSteps.ts b/src/data/workflowSteps.ts index 873aee25..3a79538f 100644 --- a/src/data/workflowSteps.ts +++ b/src/data/workflowSteps.ts @@ -12,26 +12,23 @@ interface WorkflowStep { export const workflowSteps: WorkflowStep[] = [ { number: '01', - category: 'Erfassen', - title: 'Messen', - description: - 'Bodenfeuchtesensoren erfassen Parameter wie Bodenfeuchte, Temperatur und Bodenwasserspannung in mehreren Tiefen (30/60/90 cm). Die Daten werden energieeffizient über LoRaWAN übertragen.', + category: 'data.workflowSteps.measure.category', + title: 'data.workflowSteps.measure.title', + description: 'data.workflowSteps.measure.description', icon: Droplets, }, { number: '02', - category: 'Analysieren', - title: 'Verstehen', - description: - 'Ein Ampelsystem zeigt auf einer Karte den aktuellen Bewässerungsbedarf. Mitarbeiter erkennen auf einen Blick, welche Grünflächen Wasser brauchen. Zeitverläufe ermöglichen detaillierte Analysen.', + category: 'data.workflowSteps.understand.category', + title: 'data.workflowSteps.understand.title', + description: 'data.workflowSteps.understand.description', icon: Eye, }, { number: '03', - category: 'Ausführen', - title: 'Handeln', - description: - 'Automatisierte Einsatz- und Routenplanung erzeugt optimierte Bewässerungstouren unter Berücksichtigung von Wasserkapazität, Fahrzeuggröße und Straßenrestriktionen.', + category: 'data.workflowSteps.act.category', + title: 'data.workflowSteps.act.title', + description: 'data.workflowSteps.act.description', icon: Route, }, ] diff --git a/src/i18n/config.ts b/src/i18n/config.ts new file mode 100644 index 00000000..b73025b5 --- /dev/null +++ b/src/i18n/config.ts @@ -0,0 +1,18 @@ +import i18next from 'i18next' +import { initReactI18next } from 'react-i18next' +import de_translation from './de/translation.json' +import en_translation from './en/translation.json' + +void i18next.use(initReactI18next).init({ + lng: 'de', + debug: false, + resources: { + de: { + translation: de_translation, + }, + en: { + translation: en_translation, + }, + }, +}) +export default i18next diff --git a/src/i18n/de/translation.json b/src/i18n/de/translation.json new file mode 100644 index 00000000..843a390e --- /dev/null +++ b/src/i18n/de/translation.json @@ -0,0 +1,698 @@ +{ + "navigation": { + "ariaLabel": "Hauptnavigation", + "mobileTitle": "Hauptnavigation", + "items": { + "project": "Das Projekt", + "releases": "Releases", + "contact": "Kontakt", + "github": "GitHub" + }, + "demo": { + "ariaLabel": "Demo", + "label": "Jetzt ausprobieren" + }, + "legal": { + "imprint": "Impressum", + "privacy": "Datenschutz" + } + }, + "welcomeCard": { + "titlePrefix": "Willkommen bei", + "titleHighlight": "Green Ecolution", + "subtitle": "Intelligentes Grünflächenmanagement", + "description": "Erfahre, wie wir mit smarter Sensorik und datengestützten Analysen die Bewässerung städtischer Grünflächen optimieren – für gesündere Bäume, Beete und Parks bei effizientem Ressourceneinsatz.", + "button": "Jetzt entdecken" + }, + "contactHero": { + "intro": "Wir freuen uns auf dich", + "cards": { + "email": { + "title": "Schreib uns", + "description": "Hast du Fragen zum Projekt oder möchtest du mehr erfahren? Wir melden uns zeitnah bei dir zurück.", + "cta": "E-Mail senden" + }, + "github": { + "title": "Open Source", + "description": "Entdecke unseren Code, trage zur Entwicklung bei oder nutze Green Ecolution für deine Kommune.", + "cta": "Auf GitHub ansehen" + } + } + }, + "homepageHero": { + "label": "Smart Irrigation", + "headline": { + "start": "Wir ermöglichen", + "highlight": "smarte Bewässerung", + "end": "von Grünflächen!" + }, + "motto": "Messen. Verstehen. Handeln.", + "description": "Mittels sensorgestützter Überwachung von Grünflächen werden Daten über das LoRaWan-Netz übermittelt und ausgewertet, sodass Handlungsempfehlungen für die Bewässerung abgegeben werden können.", + "button": "Animation abspielen" + }, + "homepageHeroTrees": { + "adoptTreeAriaLabel": "Baum adoptieren" + }, + "homepageOverlay": { + "popups": { + "irrigationStatus": { + "label": "Messung des Bewässerungszustandes", + "description": "Die Bodenfeuchte wird in Abhängigkeit der Vegetationsform in unterschiedlichen Bodentiefen gemessen, um Daten über verschiedene Bodenschichten zu erhalten." + }, + "dataTransmission": { + "label": "Übertragung der Daten", + "description": "Die Sensordaten werden mittels öffentlichen LoRaWAN-Netzwerk an ein Backend zur weiteren Verarbeitung übermittelt. LoRaWAN benötigt wenig Energie und besitzt eine hohe Reichweite, was zu einer großen Flächenabdeckung und einem geringen Wartungsaufwand führt." + }, + "recommendations": { + "label": "Handlungsempfehlungen", + "description": "Die übermittelten Sensordaten werden anhand wissenschaftlicher/mathematischer Methodiken ausgewertet. Auf einen Dashboard wird graphisch dargestellt, ob eine Bewässerung in nächster Zeit notwendig ist.", + "link": "Zu den Vorteilen" + } + }, + "button": { + "next": "Weiter", + "discover": "Entdecken" + }, + "closeAriaLabel": "Popup schließen" + }, + "adoptTreeModal": { + "ariaLabel": "Adoptionsurkunde für {{fullName}}", + "certificateTitle": "Adoptionsurkunde", + "certificateNumber": "Nr. {{number}}", + "fullName": "{{name}} die {{species}}", + "location": "wartet in Flensburg auf dich", + "didYouKnow": "Wusstest du?", + "quote": "„Danke, dass du an mich denkst! Mit Projekten wie Green Ecolution bekommen Stadtbäume wie ich endlich die Aufmerksamkeit, die wir verdienen.\"", + "since": "— {{name}}, seit {{year}} in Flensburg", + "button": "Danke, {{name}}! 🌳" + }, + "adoptTreeData": { + "species": { + "birch": "Birke", + "spruce": "Fichte", + "oak": "Eiche", + "beech": "Buche", + "chestnut": "Kastanie", + "linden": "Linde", + "maple": "Ahorn", + "ash": "Esche", + "elm": "Ulme", + "plane": "Platane", + "fir": "Tanne", + "willow": "Weide", + "robinia": "Robinie", + "alder": "Erle", + "poplar": "Pappel" + }, + "funFacts": { + "cooling": "Ein großer Stadtbaum kann bis zu 400 Liter Wasser am Tag verdunsten und so die Umgebung um bis zu 3°C kühlen.", + "oxygen": "Eine einzige Buche produziert genug Sauerstoff für 10 Menschen pro Jahr.", + "dust": "Stadtbäume filtern einen relevanten Anteil des Feinstaubs aus der Luft in ihrer unmittelbaren Umgebung.", + "roots": "Die Wurzeln eines Straßenbaums erstrecken sich oft über das Anderthalbfache der Kronenfläche.", + "co2": "Ein 100-jähriger Baum hat in seinem Leben etwa 5 Tonnen CO₂ gebunden.", + "woodWideWeb": "Bäume kommunizieren über unterirdische Pilznetzwerke - das sogenannte „Wood Wide Web\".", + "lifetime": "Straßenbäume leben im Durchschnitt nur 60 Jahre - auf dem Land werden sie dreimal so alt.", + "noise": "Ein dichter Baumbestand kann den Lärmpegel um bis zu 10 Dezibel senken.", + "water": "In heißen Sommern braucht ein Stadtbaum bis zu 200 Liter Wasser pro Woche zusätzlich." + } + }, + "releaseCard": { + "moreHighlights": "+{{count}} mehr" + }, + "releaseTimeline": { + "empty": "Es sind noch keine Release Notes vorhanden." + }, + "components": { + "backToTop": { + "ariaLabel": "Zurück nach oben" + }, + "errorFallback": { + "title": "Etwas ist schief gelaufen", + "description": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut oder kehre zur Startseite zurück.", + "retryLabel": "Erneut versuchen", + "homeLabel": "Zur Startseite" + } + }, + "helper": { + "sliderTranslations": { + "prev": "Vorheriges Element anzeigen", + "next": "Nächstes Element anzeigen", + "first": "Erstes Element anzeigen", + "last": "Letztes Element anzeigen", + "slideX": "Zu Seite %s springen", + "pageX": "Zu Seite %s springen", + "carousel": "Slider", + "select": "Paginierung der Elemente", + "slide": "Slider Element", + "slideLabel": "%s von %s" + } + }, + "data": { + "processSteps": { + "installSensors": { + "label": "Sensoren installieren", + "shortName": "Installation", + "description": "Bodenfeuchtesensoren werden an ausgewählten Bäumen angebracht – schnell, unkompliziert und wartungsarm." + }, + "collectRealtimeData": { + "label": "Echtzeitdaten erfassen", + "shortName": "Daten", + "description": "Die Sensoren messen kontinuierlich die Bodenfeuchtigkeit und übertragen die Werte automatisch ins System." + }, + "detectWateringNeed": { + "label": "Bewässerungsbedarf erkennen", + "shortName": "Analyse", + "description": "Das Dashboard zeigt dir auf einen Blick, welche Bäume Wasser brauchen – priorisiert nach Dringlichkeit." + }, + "planOptimizedRoutes": { + "label": "Optimierte Routen planen", + "shortName": "Planung", + "description": "Green Ecolution berechnet die effizienteste Tour für dein Team – weniger Fahrzeit, mehr Bewässerung." + }, + "waterAndEvaluate": { + "label": "Bewässern und auswerten", + "shortName": "Umsetzung", + "description": "Dein Team fährt die optimierte Route. Danach siehst du genau, wie viel Wasser wo eingesetzt wurde." + } + }, + "governancePillars": { + "license": { + "category": "Lizenz", + "title": "AGPL-3.0-only", + "description": "Lizenziert unter der AGPL. Finanziert im Rahmen des Landesprogramms „Offene Innovation\" des DigitalHub.SH Schleswig-Holstein." + }, + "sovereignty": { + "category": "Souveränität", + "title": "Digitale Souveränität", + "description": "Keine Abhängigkeit von proprietären Plattformen. Kommunen behalten die Kontrolle über ihre Daten und Infrastruktur. Kein Vendor-Lock-in." + }, + "modularity": { + "category": "Modularität", + "title": "Plugin-System", + "description": "Modulare Erweiterungen für kommunenspezifische Anpassungen ohne Änderung der Kernsoftware. Import-Plugins für Baumkataster, CSV, Datenbanken." + }, + "integration": { + "category": "Integration", + "title": "API-first", + "description": "Offene Schnittstellen für Integration in kommunale IT-Landschaften. Anbindung an IoT-Hubs und Open-Data-Portale." + }, + "community": { + "category": "Community", + "title": "Nachnutzung & Community", + "description": "Quellcode und Dokumentation öffentlich auf GitHub. Andere Kommunen können die Lösung nachnutzen und anpassen." + }, + "efficiency": { + "category": "Wirtschaftlichkeit", + "title": "Kosteneffizienz", + "description": "Keine Lizenzkosten. Geschäftsmodell basiert auf Dienstleistungen: Hosting, Anpassung, Sensorvertrieb. Regionale Wertschöpfung in SH." + } + }, + "challengeFigures": { + "water": { + "value": "50.000", + "unit": "Liter / Jahr", + "description": "Wasser werden pro mittelgroße Kommune jährlich ausgebracht, ohne Datengrundlage, ohne bedarfsgerechte Steuerung." + }, + "tree": { + "value": "1.700 €", + "unit": "pro Baum", + "description": "kostet ein einzelner Straßenbaum. Ein vermeidbarer Totalverlust durch fehlende bedarfsgerechte Bewässerung finanziert Jahre Sensorbetrieb." + }, + "bed": { + "value": "bis 60.000 €", + "unit": "pro Beet", + "description": "kann ein komplettes Straßenbeet kosten, inklusive Tiefbau, Substrat und Infrastruktur." + } + }, + "architectureSteps": { + "sensor": { + "label": "Sensor", + "description": "Misst Bodenfeuchte am Baum" + }, + "gateway": { + "label": "Gateway", + "description": "LoRaWAN Übertragung" + }, + "backend": { + "label": "Backend", + "description": "Datenverarbeitung & Analyse" + }, + "dashboard": { + "label": "Dashboard", + "description": "Visualisierung & Tourenplanung" + } + }, + "sensorSpecs": { + "specs": { + "depths": "Messtiefen", + "network": "Funknetz", + "battery": "Jahre Batterie" + }, + "features": { + "soilMoisture": { + "label": "Bodenfeuchte", + "description": "Volumetrische Messung der Bodenfeuchtigkeit in mehreren Tiefen" + }, + "temperature": { + "label": "Temperatur", + "description": "Erfassung der Bodentemperatur für präzise Bewässerungsempfehlungen" + }, + "waterTension": { + "label": "Bodenwasserspannung", + "description": "Messung der Saugspannung zur Bestimmung der Wasserverfügbarkeit" + } + } + }, + "roadmapItems": { + "mobileApp": { + "title": "Mobile App mit QR-Scan", + "description": "Sensor-Setup per QR-Code und GPS direkt vor Ort am Baum" + }, + "sensorFirmware": { + "title": "Eigene Sensor-Firmware", + "description": "Vollständig selbst entwickelte Firmware für maximale Kontrolle und Anpassbarkeit" + }, + "roles": { + "title": "Benutzer- und Rollenkonzept", + "description": "Feingranulare Rechteverwaltung für Mitarbeitende, Dienstleister und Partnerkommunen" + }, + "openData": { + "title": "Open-Data-Export", + "description": "Anbindung an das Open-Data-Portal des Landes Schleswig-Holstein" + }, + "greenSpaceTypes": { + "title": "Weitere Grünflächentypen", + "description": "Erweiterung auf Beete, Stauden und Parks über Bäume hinaus" + } + }, + "workflowSteps": { + "measure": { + "category": "Erfassen", + "title": "Messen", + "description": "Bodenfeuchtesensoren erfassen Parameter wie Bodenfeuchte, Temperatur und Bodenwasserspannung in mehreren Tiefen (30/60/90 cm). Die Daten werden energieeffizient über LoRaWAN übertragen." + }, + "understand": { + "category": "Analysieren", + "title": "Verstehen", + "description": "Ein Ampelsystem zeigt auf einer Karte den aktuellen Bewässerungsbedarf. Mitarbeiter erkennen auf einen Blick, welche Grünflächen Wasser brauchen. Zeitverläufe ermöglichen detaillierte Analysen." + }, + "act": { + "category": "Ausführen", + "title": "Handeln", + "description": "Automatisierte Einsatz- und Routenplanung erzeugt optimierte Bewässerungstouren unter Berücksichtigung von Wasserkapazität, Fahrzeuggröße und Straßenrestriktionen." + } + } + }, + "layout": { + "footer": { + "homeAriaLabel": "Zur Startseite navigieren", + "logoAlt": "Logo Green Ecolution", + "description": "Green Ecolution ist ein digitales System zur bedarfsgerechten und ressourcenschonenden Bewässerung von Stadtbäumen und leistet damit einen Beitrag zu einer nachhaltigen und klimaresilienten Stadtentwicklung.", + "contactAriaLabel": "Kontaktiere uns gern per Mail", + "contactLabel": "Kontakt", + "githubAriaLabel": "Besuche uns auf GitHub", + "metaNavigationAriaLabel": "Meta-Navigation", + "legal": { + "imprint": "Impressum", + "privacy": "Datenschutz" + } + }, + "header": { + "skipToContent": "Zum Hauptinhalt springen", + "homeAriaLabel": "Zur Startseite navigieren", + "navigationToggleAriaLabel": "Hauptnavigation öffnen" + } + }, + "pages": { + "breadcrumbs": { + "home": "Startseite", + "project": "Projekt", + "contact": "Kontakt" + }, + "home": { + "documentTitle": "Startseite | Green Ecolution | Smartes Grünflächenmanagement" + }, + "project": { + "documentTitle": "Projekt | Green Ecolution | Smartes Grünflächenmanagement", + "hero": { + "headline": "Smartes Grünflächenmanagement für lebenswerte Städte", + "description": "Green Ecolution ist eine Open-Source-Lösung für die effiziente Bewässerung urbaner Bäume. Unsere Software kombiniert Sensordaten mit intelligenter Routenoptimierung und ermöglicht so eine gezielte, ressourcenschonende Einsatzplanung. Entwickelt in Zusammenarbeit mit der Stadt Flensburg – bald auch verfügbar für deine Kommune." + } + }, + "contact": { + "documentTitle": "Kontakt | Green Ecolution | Smartes Grünflächenmanagement", + "label": "Kontakt", + "hero": { + "headline": "Lass uns in Kontakt treten", + "description": "Du hast Fragen zum Projekt, möchtest deine Kommune anbinden oder zur Entwicklung beitragen? Wir freuen uns über jede Nachricht und melden uns zeitnah bei dir." + } + }, + "notFound": { + "title": "Die Seite konnte nicht gefunden werden.", + "description": "Die gewünschte Seite ist nicht erreichbar, da sie entweder nicht existiert oder es zu einem Fehler gekommen ist. Error-Code: 404", + "homeAriaLabel": "Zur Startseite", + "homeLabel": "Zur Startseite" + }, + "releases": { + "documentTitle": "Releases | Green Ecolution | Smartes Grünflächenmanagement", + "label": "Releases", + "title": "Release Notes", + "description": "Entdecke die neuesten Funktionen, Verbesserungen und Bugfixes – wir arbeiten kontinuierlich daran, Green Ecolution noch besser zu machen.", + "latestLabel": "Aktuelles Release", + "newLabel": "Neu", + "detailsLabel": "Details ansehen", + "olderLabel": "Ältere Releases" + }, + "releaseDetail": { + "documentTitle": "v{{version}} - {{title}} | Green Ecolution", + "backAriaLabel": "Zurück zu allen Releases", + "backLabel": "Alle Releases", + "label": "Release Notes", + "currentLabel": "Aktuell", + "releaseLinkLabel": "Release", + "sourceLinkLabel": "Source", + "changelogTitle": "# Changelog for v{{version}}", + "navigationAriaLabel": "Release Navigation", + "newerVersionLabel": "Neuere Version", + "olderVersionLabel": "Ältere Version", + "feedbackText": "Fehler gefunden oder Feedback zu diesem Release?", + "issueLabel": "Issue erstellen →" + } + }, + "sections": { + "advantages": { + "label": "Vorteile", + "title": "Alle weiteren Funktionen und Vorteile im Überblick.", + "description": "Das Projekt ist öffentlich einsehbar und hat als Ziel, den Wasserverbrauch für die Bewässerung zu verringern sowie eine variable Einsatzplanung zu ermöglichen.", + "items": { + "open": { + "label": "Offene Lösung für alle", + "description": "Skalierbare Open-Source-Lösung für Kommunen zur Förderung von Weiterentwicklungen und Transparenz" + }, + "routes": { + "label": "Optimierte Routen", + "description": "Individuelle Einsatzplanung zur effizienteren Bewässerung" + }, + "less": { + "label": "Weniger ist mehr", + "description": "Gezielte Bewässerung, weniger Wasserverbrauch" + } + } + }, + "architecture": { + "label": "System-Architektur", + "title": "Der Datenfluss im Überblick", + "description": "Von der Messung am Baum bis zur optimierten Bewässerungsroute – so fließen die Daten durch das Green Ecolution System." + }, + "challenge": { + "quote": { + "primary": "Städte gießen nach Gefühl.", + "highlight": "Nicht nach Bedarf." + }, + "description": "Städtische Grünflächen regulieren das Mikroklima, fördern Biodiversität und stärken den Standortwettbewerb. Doch anhaltende Trockenheit und fehlende Digitalisierung gefährden dieses Gut. Die Bewässerungsplanung vieler Kommunen stützt sich allein auf die Einschätzung einzelner Mitarbeiter, ganz ohne Datengrundlage. Statt bedarfsgerechter Bewässerung wird pauschal gegossen, was Wasser verschwendet und trotzdem nicht alle Bäume erreicht. Nicht optimierte Bewässerungsfahrten verursachen zusätzlich vermeidbare CO₂-Emissionen." + }, + "contact": { + "label": "Kontakt", + "title": "Lass uns gemeinsam grüner werden", + "description": "Hast du Fragen, Feedback oder ein Anliegen? Wir freuen uns über deine Nachricht und melden uns so schnell wie möglich bei dir.", + "emailAriaLabel": "Kontaktiere uns gerne per E-Mail", + "emailLabel": "Schreib uns" + }, + "dashboardPreview": { + "label": "Software", + "title": { + "firstLine": "Fundierte Handlungsempfehlungen", + "secondLine": "zur Bewässerung auf einen Blick" + }, + "description": "Unser System liefert anhand wissenschaftlicher Datenauswertung fundierte Handlungsempfehlungen, zu welchem Zeitpunkt eine Bewässerung notwendig ist. Die Daten werden dahingehend aufbereitet, dass diese einfach zu interpretieren sind und in die Einsatzplanung eingebunden werden können.", + "imageAlt": "Green Ecolution Dashboard - Übersicht der Bewässerungsempfehlungen" + }, + "demoInstance": { + "label": "Live Demo", + "title": "Überzeug dich selbst", + "description": "Die öffentlich zugängliche Demo-Instanz zeigt den aktuellen Funktionsumfang: Kartenansicht mit Ampelsystem, Dashboard mit Sensordaten und automatisierte Routenberechnung. Keine Installation nötig, direkt im Browser.", + "openDemoAriaLabel": "Demo von Green Ecolution im Browser öffnen", + "openDemoLabel": "Demo öffnen", + "imageAlt": "Green Ecolution Demo, Dashboard mit Kartenansicht und Sensordaten" + }, + "faq": { + "label": "FAQ", + "title": "Oft gestellte Fragen zu Green Ecolution", + "items": { + "behind": { + "question": "Wer steckt hinter dem Projekt Green Ecolution?", + "schemaAnswer": "Das Projekt \"Green Ecolution\" wurde im Rahmen eines Forschungsprojekts im Masterstudiengang \"Angewandte Informatik\" an der Hochschule Flensburg ins Leben gerufen. Nach dem erfolgreichen Abschluss des Forschungsprojekts wird die Weiterentwicklung des Systems nun von PROGEEK übernommen, in enger Zusammenarbeit mit der Smarten Grenzregion und der Stadt Flensburg.", + "answer": "Das Projekt \"Green Ecolution\" wurde im Rahmen eines Forschungsprojekts im Masterstudiengang \"Angewandte Informatik\" an der Hochschule Flensburg ins Leben gerufen. Nach dem erfolgreichen Abschluss des Forschungsprojekts wird die Weiterentwicklung des Systems nun von PROGEEK übernommen, in enger Zusammenarbeit mit der Smarten Grenzregion und der Stadt Flensburg." + }, + "value": { + "question": "Welchen Mehrwert bietet das Projekt?", + "schemaAnswer": "Das Forschungsprojekt \"Green Ecolution\" hat gezeigt, wie digitale Technologien gezielt eingesetzt werden können, um die Bewässerung von Stadtbäumen effizienter, nachhaltiger und ressourcenschonender zu gestalten. Durch den Einsatz moderner Sensorik und intelligenter Datenauswertung wurde eine Grundlage geschaffen, um Wasserverbrauch und Pflegeaufwand deutlich zu reduzieren.", + "answer": { + "primary": "Das Forschungsprojekt \"Green Ecolution\" hat gezeigt, wie digitale Technologien gezielt eingesetzt werden können, um die Bewässerung von Stadtbäumen effizienter, nachhaltiger und ressourcenschonender zu gestalten. Durch den Einsatz moderner Sensorik und intelligenter Datenauswertung wurde eine Grundlage geschaffen, um Wasserverbrauch und Pflegeaufwand deutlich zu reduzieren.", + "secondary": "Die gewonnenen Erkenntnisse und entwickelten Systeme leisten einen wichtigen Beitrag zur nachhaltigen Stadtentwicklung in Flensburg. Sie unterstützen eine datenbasierte Entscheidungsfindung und fördern den verantwortungsvollen Umgang mit natürlichen Ressourcen - zum Nutzen von Umwelt, Stadtverwaltung und Bürger:innen." + } + }, + "public": { + "question": "Was bedeutet es, dass das Projekt öffentlich zugänglich ist?", + "schemaAnswer": "Der Quellcode des Projekts ist in einem öffentlich zugänglichen GitHub-Repository verfügbar. Dadurch kann der aktuelle Entwicklungsstand jederzeit eingesehen werden, was Transparenz schafft und interessierten Personen ermöglicht, die Weiterentwicklung nachzuvollziehen oder sich aktiv einzubringen.", + "answer": { + "beforeGithub": "Der Quellcode des Projekts ist in einem öffentlich zugänglichen", + "afterGithub": "verfügbar. Dadurch kann der aktuelle Entwicklungsstand jederzeit eingesehen werden, was Transparenz schafft und interessierten Personen ermöglicht, die Weiterentwicklung nachzuvollziehen oder sich aktiv einzubringen.", + "beforeOpenData": "Perspektivisch ist zudem eine Anbindung an das", + "afterOpenData": "des Landes Schleswig-Holstein vorgesehen, um zukünftig ausgewählte Sensordaten öffentlich zugänglich zu machen. Diese Erweiterung befindet sich derzeit in Planung." + } + }, + "sensors": { + "question": "Welche Sensoren werden eingesetzt?", + "schemaAnswer": "Im Rahmen des Forschungsprojekts wurden Watermark-Sensoren zur Messung der Bodenwasserspannung und SMT100-Sensoren zur Messung der Bodenfeuchte und -temperatur eingesetzt. Diese Sensoren bildeten die Grundlage für die Entwicklung und Erprobung des Systems.", + "answer": { + "intro": "Im Rahmen des Forschungsprojekts wurden folgende Sensoren eingesetzt, um präzise Daten zur Bodenfeuchte und -beschaffenheit zu erfassen. Diese Sensoren bildeten die Grundlage für die Entwicklung und Erprobung des Systems.", + "watermarkPrefix": "Zur Messung der Bodenwasserspannung:", + "smt100Prefix": "Zur Messung der Bodenfeuchte und -temperatur:", + "outlook": "In zukünftigen Entwicklungsphasen kann die Sensorik je nach Anforderungen und technologischem Fortschritt weiter angepasst oder erweitert werden." + } + }, + "progress": { + "question": "Wie ist der aktuelle Fortschritt des Projekts?", + "schemaAnswer": "Das Forschungsprojekt „Green Ecolution\" wurde im Rahmen des Masterstudiengangs „Angewandte Informatik\" an der Hochschule Flensburg erfolgreich abgeschlossen. Im Oktober 2025 erhielt das Projekt im Rahmen des DigitalHub Call for Concepts eine Finanzierung. Aktuell arbeiten PROGEEK, die Stadt Flensburg und die Smarte Grenzregion gemeinsam an der Weiterentwicklung.", + "answer": { + "beforeHs": "Das Forschungsprojekt „Green Ecolution“ wurde im Rahmen des Masterstudiengangs „Angewandte Informatik“ an der", + "afterHs": "erfolgreich abgeschlossen. Aufbauend auf den im Projekt erzielten Ergebnissen wird die Weiterentwicklung nun fortgesetzt.", + "beforeDigitalHub": "Im Oktober 2025 erhielt das Projekt im Rahmen des", + "beforeOpenSourceProgram": "des Landesprogramms", + "afterDigitalHub": "eine Finanzierung. Dadurch kann das System weiter ausgebaut und praxisnah erprobt werden.", + "beforeProgeek": "Aktuell arbeiten", + "beforeStadtFlensburg": "die", + "beforeSmarteGrenzregion": "und die", + "afterSmarteGrenzregion": "gemeinsam an der Weiterentwicklung und Integration des Systems, um die gewonnenen Erkenntnisse nachhaltig in den kommunalen Alltag zu überführen." + } + } + } + }, + "features": { + "label": "Features", + "title": "Green Ecolution im Überblick", + "description": "Von der Sensorerfassung über die intelligente Routenplanung bis zur detaillierten Auswertung - alle Funktionen für ein effizientes und nachhaltiges Grünflächenmanagement", + "items": { + "dashboard": { + "label": "Echtzeit-Dashboard", + "description": "Alle wichtigen KPIs auf einen Blick: Bodenfeuchtewerte, anstehende Touren, Teamverfügbarkeit und Fahrzeugstatus in einem zentralen Dashboard." + }, + "grouping": { + "label": "Intelligente Gruppierung", + "description": "Fasse Bäume zu Bewässerungs­einheiten zusammen. Automatische Berechnung des Wasserbedarfs pro Cluster." + }, + "fleet": { + "label": "Fleet Management", + "description": "Verwalte Transporter und Anhänger mit Wasserkapazitäten. Automatische Nachfüllstopps in der Routenplanung." + }, + "tourPlanning": { + "label": "Tour-Planung", + "description": "Optimierte Bewässerungspläne mit Echtzeit-Status: Von 'geplant' über 'aktiv' bis 'abgeschlossen'." + }, + "team": { + "label": "Teamverwaltung", + "description": "Verwalte Fahrer mit Führerscheinklassen und Verfügbarkeit. Optimiere die Einsatzplanung." + }, + "analysis": { + "label": "Nachanalyse", + "description": "Dokumentiere den tatsächlichen Wasserverbrauch pro Cluster und Tour. Analysiere Trends und optimiere zukünftige Planungen datenbasiert." + } + } + }, + "furtherLinks": { + "label": "Ressourcen", + "title": "Weiterführende Links & Erwähnungen", + "items": { + "flensburgSoftware": { + "label": "Software für die Stadt Flensburg", + "subLabel": "Dies ist die Software, die für die Stadt Flensburg entwickelt und aufgesetzt wurde. Diese Software wird primär vom Technischen Betriebszentrum Flensburg genutzt." + }, + "githubOrganization": { + "label": "Organisation auf GitHub", + "subLabel": "Dort finden Sie alle Code-Repositories, die mit dem Projekt in Verbindung stehen, wie z. B. Backend und Frontend der Software" + }, + "hsFlensburgBlog": { + "label": "Blog-Beitrag der HS Flensburg", + "subLabel": "Auch auf der Website der HS Flensburg wurde ein Beitrag zum Forschungsprojekt veröffentlicht." + }, + "hsFlensburgInstagram": { + "label": "Instagram-Beitrag der HS Flensburg", + "subLabel": "Nicht nur auf der Website, sondern auch auf Instagram wurde Green Ecolution erwähnt." + }, + "digitalHub": { + "label": "Teil des DigitalHub.SH 2025", + "subLabel": "Green Ecolution wurde als eines der Open-Source-Projekte im Rahmen des DigitalHub.SH 2025 vorgestellt und finanziert." + }, + "flensburgPress": { + "label": "Pressemitteilung der Stadt Flensburg", + "subLabel": "Auch die Stadt Flensburg berichtete über Green Ecolution und die Bedeutung des Projekts für ein nachhaltiges Stadtmanagement." + }, + "liveDemo": { + "label": "Live Demo", + "subLabel": "Die öffentlich zugängliche Demo-Instanz zeigt den aktuellen Funktionsumfang: Kartenansicht mit Ampelsystem, Dashboard mit Sensordaten und automatisierte Routenberechnung." + } + } + }, + "hero": { + "defaultLabel": "Projekt" + }, + "introduction": { + "label": "Überblick", + "title": "Was beinhaltet smartes Grünflächenmanagement?", + "description": "Smartes Grünflächenmanagement umfasst die effiziente Überwachung und Bewässerung von Vegetation auf Grünflächen durch den Einsatz moderner Technologien wie Sensoren und Datenanalyse. Dadurch wird eine präzise Steuerung der Pflegemaßnahmen ermöglicht, die angepasst sind an die spezifischen Standortbedingungen.", + "carouselAriaLabel": "Fakten zum Grünflächenmanagement", + "facts": { + "sensor": { + "label": "Entwicklung einer Sensorlösung", + "description": "Daten zur Bodenfeuchte werden mithilfe von in unterschiedlicher Tiefe platzierten Sensoren geliefert." + }, + "evaluation": { + "label": "Auswertung der Messdaten", + "description": "Auswertung der durch Sensoren übermittelten Daten für eine bedarfsgerechte Bewässerung von Jungbäumen." + }, + "youngTrees": { + "label": "Augenmerk auf Jungbäume", + "description": "Jungbäume sind besonders hitzeanfällig und daher äußerst schutzbedürftig. Aus diesem Grund werden Bäume in deren ersten drei Standjahren überwacht." + }, + "locations": { + "label": "Monitoring mehrerer Standorte", + "description": "Unter Verwendung des LoRaWan-Netzes können verschiedene Standorte überwacht und weitere einfach eingebunden werden." + } + } + }, + "latestRelease": { + "label": "Releases", + "title": "Was gibt's Neues?", + "description": "Wir entwickeln Green Ecolution kontinuierlich weiter. Schau dir die neuesten Funktionen, Verbesserungen und Bugfixes an – und erfahre, woran wir gerade arbeiten.", + "allReleasesAriaLabel": "Alle Releases ansehen", + "allReleasesLabel": "Alle Releases", + "currentLabel": "Aktuell", + "detailsLabel": "Details ansehen" + }, + "openSourceGovernance": { + "label": "Governance", + "title": "Open Source als Prinzip", + "description": "Transparenz, Unabhängigkeit und Nachnutzbarkeit: die Grundpfeiler unserer Open-Source-Strategie." + }, + "process": { + "label": "Prozess", + "title": "Messen. Verstehen. Handeln.", + "description": "Von der Bodenfeuchte zur optimierten Bewässerungsroute, in einem durchgängigen digitalen Workflow.", + "stepDetails": { + "sensor": { + "depths": "Bodenfeuchtesensoren in 30, 60 und 90 cm Tiefe", + "measurements": "Erfassung von Bodenfeuchte, Temperatur und Bodenwasserspannung", + "transmission": "Energieeffiziente Übertragung über LoRaWAN", + "installation": "Bodenbündige Installation, kein Einfluss auf Pflegearbeiten" + }, + "dashboard": { + "trafficLight": "Ampelsystem zeigt Bewässerungsbedarf auf einer Karte", + "prioritization": "Priorisierung nach Dringlichkeit bei begrenzten Kapazitäten", + "timelines": "Zeitverläufe für Bodenfeuchte, Temperatur und Wasserspannung", + "kpis": "Echtzeit-Dashboard mit allen relevanten KPIs" + }, + "routing": { + "planning": "Automatisierte Einsatz- und Routenplanung", + "capacity": "Berücksichtigung von Wasserkapazität und Fahrzeuggröße", + "restrictions": "Straßen- und Zufahrtsrestriktionen einbezogen", + "export": "Export der Routen auf Navigationsgeräte" + } + } + }, + "processCompact": { + "label": "Lösung", + "title": "Der durchgängige Workflow", + "moreAriaLabel": "Mehr über den Prozess erfahren", + "moreLabel": "Mehr erfahren" + }, + "sensorProbe": { + "label": "Hardware", + "title": "Die Bodensonde", + "description": "Konzipiert für den Einsatz im öffentlichen Raum. Sensoren in drei Tiefen (30, 60 und 90 cm) bilden das gesamte Wurzelprofil eines Baumes ab, von den oberflächennahen Feinwurzeln bis zu den tieferen Hauptwurzeln. So lässt sich erkennen, ob Wasser tatsächlich im Wurzelbereich ankommt oder nur die Oberfläche benetzt wird. Die Installation erfolgt bodenbündig mit handelsüblichen Erdbohrern. Pflegearbeiten wie Mähen werden nicht beeinträchtigt.", + "illustrationAriaLabel": "Schematische Darstellung einer Bodensonde in drei Tiefen", + "depths": { + "fineRoots": "Feinwurzeln", + "mainRoots": "Hauptwurzeln", + "deepRoots": "Tiefenwurzeln" + } + }, + "stakeholder": { + "label": "Partner & Beteiligte", + "title": "Wer sind die Beteiligten?", + "description": "In Zusammenarbeit zwischen PROGEEK, der Smarten-Grenzregion, der Stadt Flensburg und der Hochschule Flensburg soll eine bedarfsgerechte und datenbasierte Bewässerung für Bäume aufgebaut werden.", + "carouselAriaLabel": "Beteiligten am Projekt", + "items": { + "progeek": { + "role": "Technischer Partner", + "description": "PROGEEK steht für innovative IT-Lösungen, individuelle Softwareentwicklung und digitale Beratung – mit dem Ziel, Unternehmen auf ihrem Weg in die Zukunft der Digitalisierung zu begleiten." + }, + "smarteGrenzregion": { + "role": "Projektkoordinator", + "description": "Das Projekt „Smarte Grenzregion zwischen den Meeren\" will die digitale Transformation in der Region vorantreiben, um eine integrierte und nachhaltige Stadt- und Regionalentwicklung zu gestalten und das Gemeinwohl zu stärken." + }, + "hochschuleFlensburg": { + "role": "Initiator", + "description": "Die Hochschule Flensburg bietet praxisnahe Studiengänge mit Fokus auf angewandte Forschung und enge Zusammenarbeit mit der Industrie an." + }, + "tbzFlensburg": { + "role": "Anwendungspartner", + "description": "Das Technische Betriebszentrum (TBZ) ist der zentrale Dienstleister für die Stadt Flensburg und u.a. für die Pflege öffentlicher Grünflächen, Straßenreinigung sowie Abfallwirtschaft zuständig." + } + } + }, + "videos": { + "label": "Videos", + "title": "Lerne das Projekt per Video kennen", + "description": "Im Rahmen des Forschungsprojekts wurden nicht nur eine Sensorlösung und eine Software entwickelt, sondern auch Videos produziert. Diese Videos veranschaulichen anschaulich die Inhalte des Projekts, einschließlich der Zielsetzung, der Problemstellung und der von uns entwickelten Lösung.", + "cards": { + "short": { + "title": "Kurzvideo", + "description": "In diesem kurzen Video geben wir dir einen ersten Einblick in unser Projekt. Erfahre in wenigen Minuten, worum es geht und was du von den kommenden Inhalten erwarten kannst. Schau dir das Video an, um einen schnellen Überblick zu bekommen!", + "duration": "ca. 30 Sekunden" + }, + "long": { + "title": "Langvideo", + "description": "In diesem ausführlichen Video tauchen wir tiefer in unser Projekt ein. Hier erläutern wir die wichtigsten Details, Hintergründe und die nächsten Schritte. Dieses Video bietet dir umfassende Informationen und hilft dir, das Projekt besser zu verstehen. Viel Spaß beim Anschauen und Entdecken!", + "duration": "ca. 4 Minuten" + } + } + }, + "visionRoadmap": { + "label": "Vision", + "title": "Für jede Kommune gemacht", + "description": { + "primary": "Die Plattform ist bewusst so gestaltet, dass sie in jeder Kommune eingesetzt werden kann. Kartenbereiche, Organisationsstrukturen und Bewässerungsregionen sind frei konfigurierbar.", + "secondary": "Es werden ausschließlich offene Standards und Open-Source-Komponenten verwendet. Cloud-native Architektur mit Kubernetes ermöglicht einen mandantenfähigen, hochverfügbaren Betrieb. Weitere Kommunen können leicht hinzugefügt werden." + }, + "roadmapLabel": "Roadmap", + "futureAriaLabel": "Weitere Ideen in Planung", + "futureLabel": "und vieles mehr in Planung", + "status": { + "completed": "Abgeschlossen", + "inProgress": "In Arbeit", + "planned": "Geplant" + } + } + } +} diff --git a/src/i18n/en/translation.json b/src/i18n/en/translation.json new file mode 100644 index 00000000..abaa8fd7 --- /dev/null +++ b/src/i18n/en/translation.json @@ -0,0 +1,828 @@ +{ + "navigation": { + "ariaLabel": "Main navigation", + "mobileTitle": "Main navigation", + "items": { + "project": "The Project", + "releases": "Releases", + "contact": "Contact", + "github": "GitHub" + }, + "demo": { + "ariaLabel": "Demo", + "label": "Try it now" + }, + "legal": { + "imprint": "Legal Notice", + "privacy": "Privacy Policy" + } + }, + "welcomeCard": { + "titlePrefix": "Welcome to", + "titleHighlight": "Green Ecolution", + "subtitle": "Intelligent Green Space Management", + "description": "Learn how we optimize the irrigation of urban green spaces using smart sensors and data-driven analysis — for healthier trees, flower beds, and parks with efficient resource usage.", + "button": "Discover now" + }, + "contactHero": { + "intro": "We look forward to hearing from you", + "cards": { + "email": { + "title": "Write to us", + "description": "Do you have questions about the project or would you like to learn more? We will get back to you shortly.", + "cta": "Send Email" + }, + "github": { + "title": "Open Source", + "description": "Explore our code, contribute to development, or use Green Ecolution for your municipality.", + "cta": "View on GitHub" + } + } + }, + "homepageHero": { + "label": "Smart Irrigation", + "headline": { + "start": "We enable", + "highlight": "smart irrigation", + "end": "for green spaces!" + }, + "motto": "Measure. Understand. Act.", + "description": "Using sensor-based monitoring of green spaces, data is transmitted and analyzed through the LoRaWAN network, enabling actionable irrigation recommendations.", + "button": "Play animation" + }, + "homepageHeroTrees": { + "adoptTreeAriaLabel": "Adopt a tree" + }, + "homepageOverlay": { + "popups": { + "irrigationStatus": { + "label": "Measuring irrigation status", + "description": "Soil moisture is measured at different depths depending on vegetation type to gather data across multiple soil layers." + }, + "dataTransmission": { + "label": "Data transmission", + "description": "Sensor data is transmitted via the public LoRaWAN network to a backend for further processing. LoRaWAN requires little energy and provides long range coverage, resulting in large area coverage and low maintenance effort." + }, + "recommendations": { + "label": "Recommendations for action", + "description": "The transmitted sensor data is analyzed using scientific and mathematical methodologies. A dashboard visually displays whether irrigation will be necessary in the near future.", + "link": "View the benefits" + } + }, + "button": { + "next": "Next", + "discover": "Discover" + }, + "closeAriaLabel": "Close popup" + }, + "adoptTreeModal": { + "ariaLabel": "Adoption certificate for {{fullName}}", + "certificateTitle": "Certificate of Adoption", + "certificateNumber": "No. {{number}}", + "fullName": "{{name}} the {{species}}", + "location": "is waiting for you in Flensburg", + "didYouKnow": "Did you know?", + "quote": "“Thank you for thinking of me! Projects like Green Ecolution finally give city trees like me the attention we deserve.”", + "since": "— {{name}}, in Flensburg since {{year}}", + "button": "Thank you, {{name}}! 🌳" + }, + "adoptTreeData": { + "species": { + "birch": "Birch", + "spruce": "Spruce", + "oak": "Oak", + "beech": "Beech", + "chestnut": "Chestnut", + "linden": "Linden", + "maple": "Maple", + "ash": "Ash", + "elm": "Elm", + "plane": "Plane Tree", + "fir": "Fir", + "willow": "Willow", + "robinia": "Robinia", + "alder": "Alder", + "poplar": "Poplar" + }, + "funFacts": { + "cooling": "A large urban tree can evaporate up to 400 liters of water per day and cool its surroundings by up to 3°C.", + "oxygen": "A single beech tree produces enough oxygen for 10 people per year.", + "dust": "Urban trees filter a significant portion of fine dust from the air in their immediate surroundings.", + "roots": "The roots of a street tree often extend over one and a half times the size of its crown area.", + "co2": "A 100-year-old tree has stored around 5 tons of CO₂ during its lifetime.", + "woodWideWeb": "Trees communicate through underground fungal networks — the so-called “Wood Wide Web”.", + "lifetime": "Street trees live an average of only 60 years — in rural areas they live three times longer.", + "noise": "Dense tree populations can reduce noise levels by up to 10 decibels.", + "water": "In hot summers, an urban tree may require up to 200 liters of additional water per week." + } + }, + "releaseCard": { + "moreHighlights": "+{{count}} more" + }, + "releaseTimeline": { + "empty": "No release notes available yet." + }, + "components": { + "backToTop": { + "ariaLabel": "Back to top" + }, + "errorFallback": { + "title": "Something went wrong", + "description": "An unexpected error occurred. Please try again or return to the homepage.", + "retryLabel": "Try again", + "homeLabel": "Back to homepage" + } + }, + "helper": { + "sliderTranslations": { + "prev": "Show previous item", + "next": "Show next item", + "first": "Show first item", + "last": "Show last item", + "slideX": "Go to page %s", + "pageX": "Go to page %s", + "carousel": "Carousel", + "select": "Item pagination", + "slide": "Carousel item", + "slideLabel": "%s of %s" + } + }, + "data": { + "processSteps": { + "installSensors": { + "label": "Install sensors", + "shortName": "Installation", + "description": "Soil moisture sensors are attached to selected trees - quickly, easily, and with low maintenance." + }, + "collectRealtimeData": { + "label": "Collect real-time data", + "shortName": "Data", + "description": "The sensors continuously measure soil moisture and automatically transmit the values to the system." + }, + "detectWateringNeed": { + "label": "Detect irrigation needs", + "shortName": "Analysis", + "description": "The dashboard shows you at a glance which trees need water, prioritized by urgency." + }, + "planOptimizedRoutes": { + "label": "Plan optimized routes", + "shortName": "Planning", + "description": "Green Ecolution calculates the most efficient route for your team - less driving time, more irrigation." + }, + "waterAndEvaluate": { + "label": "Irrigate and evaluate", + "shortName": "Execution", + "description": "Your team follows the optimized route. Afterwards, you can see exactly how much water was used and where." + } + }, + "governancePillars": { + "license": { + "category": "License", + "title": "AGPL-3.0-only", + "description": "Licensed under the AGPL. Funded as part of the \"Open Innovation\" state program by DigitalHub.SH Schleswig-Holstein." + }, + "sovereignty": { + "category": "Sovereignty", + "title": "Digital Sovereignty", + "description": "No dependency on proprietary platforms. Municipalities retain control over their data and infrastructure. No vendor lock-in." + }, + "modularity": { + "category": "Modularity", + "title": "Plugin System", + "description": "Modular extensions for municipality-specific adaptations without changing the core software. Import plugins for tree registers, CSV, and databases." + }, + "integration": { + "category": "Integration", + "title": "API-first", + "description": "Open interfaces for integration into municipal IT landscapes. Connectivity to IoT hubs and open data portals." + }, + "community": { + "category": "Community", + "title": "Reuse & Community", + "description": "Source code and documentation are publicly available on GitHub. Other municipalities can reuse and adapt the solution." + }, + "efficiency": { + "category": "Economic Efficiency", + "title": "Cost Efficiency", + "description": "No license fees. The business model is based on services: hosting, customization, and sensor distribution. Regional value creation in Schleswig-Holstein." + } + }, + "challengeFigures": { + "water": { + "value": "50,000", + "unit": "liters / year", + "description": "of water are applied annually per medium-sized municipality, without a data basis and without needs-based control." + }, + "tree": { + "value": "€1,700", + "unit": "per tree", + "description": "is the cost of a single street tree. One avoidable total loss due to missing needs-based irrigation can finance years of sensor operation." + }, + "bed": { + "value": "up to €60,000", + "unit": "per bed", + "description": "is what a complete street planting bed can cost, including civil engineering, substrate, and infrastructure." + } + }, + "architectureSteps": { + "sensor": { + "label": "Sensor", + "description": "Measures soil moisture at the tree" + }, + "gateway": { + "label": "Gateway", + "description": "LoRaWAN transmission" + }, + "backend": { + "label": "Backend", + "description": "Data processing & analysis" + }, + "dashboard": { + "label": "Dashboard", + "description": "Visualization & route planning" + } + }, + "sensorSpecs": { + "specs": { + "depths": "Measurement depths", + "network": "Radio network", + "battery": "Years of battery life" + }, + "features": { + "soilMoisture": { + "label": "Soil moisture", + "description": "Volumetric measurement of soil moisture at multiple depths" + }, + "temperature": { + "label": "Temperature", + "description": "Recording soil temperature for precise irrigation recommendations" + }, + "waterTension": { + "label": "Soil water tension", + "description": "Measuring suction tension to determine water availability" + } + } + }, + "roadmapItems": { + "mobileApp": { + "title": "Mobile app with QR scan", + "description": "Sensor setup via QR code and GPS directly on site at the tree" + }, + "sensorFirmware": { + "title": "Custom sensor firmware", + "description": "Fully self-developed firmware for maximum control and adaptability" + }, + "roles": { + "title": "User and role concept", + "description": "Fine-grained rights management for employees, service providers, and partner municipalities" + }, + "openData": { + "title": "Open data export", + "description": "Connection to the open data portal of the state of Schleswig-Holstein" + }, + "greenSpaceTypes": { + "title": "Additional green space types", + "description": "Expansion beyond trees to flower beds, perennials, and parks" + } + }, + "workflowSteps": { + "measure": { + "category": "Collect", + "title": "Measure", + "description": "Soil moisture sensors record parameters such as soil moisture, temperature, and soil water tension at multiple depths (30/60/90 cm). The data is transmitted energy-efficiently via LoRaWAN." + }, + "understand": { + "category": "Analyze", + "title": "Understand", + "description": "A traffic light system shows the current irrigation need on a map. Employees can see at a glance which green spaces need water. Timelines enable detailed analysis." + }, + "act": { + "category": "Execute", + "title": "Act", + "description": "Automated deployment and route planning creates optimized irrigation tours while taking water capacity, vehicle size, and road restrictions into account." + } + } + }, + "layout": { + "footer": { + "homeAriaLabel": "Navigate to homepage", + "logoAlt": "Green Ecolution logo", + "description": "Green Ecolution is a digital system for needs-based, resource-efficient irrigation of urban trees, contributing to sustainable and climate-resilient urban development.", + "contactAriaLabel": "Feel free to contact us by email", + "contactLabel": "Contact", + "githubAriaLabel": "Visit us on GitHub", + "metaNavigationAriaLabel": "Meta navigation", + "legal": { + "imprint": "Legal Notice", + "privacy": "Privacy Policy" + } + }, + "header": { + "skipToContent": "Skip to main content", + "homeAriaLabel": "Navigate to homepage", + "navigationToggleAriaLabel": "Open main navigation" + } + }, + "pages": { + "legalLabel": "Legal", + "breadcrumbs": { + "home": "Homepage", + "project": "Project", + "contact": "Contact", + "impressum": "Legal Notice", + "datenschutz": "Privacy Policy" + }, + "home": { + "documentTitle": "Homepage | Green Ecolution | Smart Green Space Management" + }, + "project": { + "documentTitle": "Project | Green Ecolution | Smart Green Space Management", + "hero": { + "headline": "Smart green space management for livable cities", + "description": "Green Ecolution is an open source solution for efficiently irrigating urban trees. Our software combines sensor data with intelligent route optimization, enabling targeted, resource-efficient deployment planning. Developed in collaboration with the City of Flensburg - soon also available for your municipality." + } + }, + "contact": { + "documentTitle": "Contact | Green Ecolution | Smart Green Space Management", + "label": "Contact", + "hero": { + "headline": "Let's get in touch", + "description": "Do you have questions about the project, want to connect your municipality, or contribute to development? We welcome every message and will get back to you shortly." + } + }, + "notFound": { + "title": "The page could not be found.", + "description": "The requested page cannot be reached because it either does not exist or an error occurred. Error code: 404", + "homeAriaLabel": "To homepage", + "homeLabel": "To homepage" + }, + "releases": { + "documentTitle": "Releases | Green Ecolution | Smart Green Space Management", + "label": "Releases", + "title": "Release Notes", + "description": "Discover the latest features, improvements, and bug fixes - we are continuously working to make Green Ecolution even better.", + "latestLabel": "Latest release", + "newLabel": "New", + "detailsLabel": "View details", + "olderLabel": "Older releases" + }, + "releaseDetail": { + "documentTitle": "v{{version}} - {{title}} | Green Ecolution", + "backAriaLabel": "Back to all releases", + "backLabel": "All releases", + "label": "Release Notes", + "currentLabel": "Current", + "releaseLinkLabel": "Release", + "sourceLinkLabel": "Source", + "changelogTitle": "# Changelog for v{{version}}", + "navigationAriaLabel": "Release navigation", + "newerVersionLabel": "Newer version", + "olderVersionLabel": "Older version", + "feedbackText": "Found a bug or have feedback on this release?", + "issueLabel": "Create issue ->" + }, + "impressum": { + "documentTitle": "Legal Notice | Green Ecolution | Smart Green Space Management", + "hero": { + "headline": "Legal Notice", + "description": "Information pursuant to Section 5 TMG" + }, + "contact": { + "title": "Contact", + "phoneLabel": "Phone:", + "emailLabel": "Email:" + }, + "commercialRegister": { + "title": "Commercial Register", + "registerCourtLabel": "Register court:", + "registerCourtValue": "Local Court of Flensburg", + "registerNumberLabel": "Registration number:", + "taxNumberLabel": "Tax number:", + "vatIdLabel": "VAT ID:", + "managingDirectorsLabel": "Managing directors:" + }, + "contentLiability": { + "title": "Liability for Content", + "paragraph1": "As a service provider, we are responsible for our own content on these pages in accordance with Section 7 para. 1 TMG and general law. However, pursuant to Sections 8 to 10 TMG, as a service provider we are not obligated to monitor transmitted or stored third-party information or to investigate circumstances indicating unlawful activity.", + "paragraph2": "Obligations to remove or block the use of information under general law remain unaffected. Liability in this regard is only possible from the point in time at which we become aware of a specific legal violation. If we become aware of corresponding legal violations, we will remove this content immediately." + }, + "linkLiability": { + "title": "Liability for Links", + "paragraph1": "Our offering contains links to external third-party websites over whose content we have no influence. Therefore, we cannot assume any liability for this external content. The respective provider or operator of the linked pages is always responsible for their content.", + "paragraph2": "The linked pages were checked for possible legal violations at the time of linking. Illegal content was not apparent at the time of linking. However, permanent monitoring of the linked pages' content is not reasonable without specific indications of a legal violation. If we become aware of legal violations, we will remove such links immediately." + }, + "copyright": { + "title": "Copyright", + "paragraph1": "The content and works created by the site operators on these pages are subject to German copyright law. Reproduction, editing, distribution, and any form of exploitation outside the limits of copyright require the written consent of the respective author or creator.", + "paragraph2": "Downloads and copies of this site are permitted for private, non-commercial use only. Where content on this site was not created by the operator, third-party copyrights are respected. In particular, third-party content is identified as such." + } + }, + "datenschutz": { + "documentTitle": "Privacy Policy | Green Ecolution | Smart Green Space Management", + "hero": { + "headline": "Privacy Policy", + "description": "Information on how your personal data is handled" + }, + "overview": { + "title": "1. Privacy at a Glance", + "generalNotesTitle": "General information", + "generalNotesText": "The following information provides a simple overview of what happens to your personal data when you visit this website. Personal data is any data with which you can be personally identified. Detailed information on data protection can be found in our privacy policy listed below this text.", + "dataCollectionTitle": "Data collection on this website", + "responsibleQuestion": "Who is responsible for data collection on this website?", + "responsibleAnswer": "Data processing on this website is carried out by the website operator. You can find the operator's contact details in the section \"Notice concerning the responsible party\" in this privacy policy.", + "howCollectQuestion": "How do we collect your data?", + "howCollectAnswer": "Your data is collected when you provide it to us. This may include data that you enter into a contact form. Other data is collected automatically or with your consent by our IT systems when you visit the website. This mainly includes technical data (e.g. internet browser, operating system, or time the page was accessed). This data is collected automatically as soon as you enter this website.", + "dataUseQuestion": "What do we use your data for?", + "dataUseAnswer": "Some data is collected to ensure error-free provision of the website. Other data may be used to analyze your user behavior.", + "rightsQuestion": "What rights do you have regarding your data?", + "rightsAnswer": "You have the right at any time to receive free information about the origin, recipients, and purpose of your stored personal data. You also have the right to request correction or deletion of this data. If you have given consent to data processing, you may withdraw this consent at any time for the future. You also have the right, under certain circumstances, to request restriction of the processing of your personal data. Furthermore, you have the right to lodge a complaint with the competent supervisory authority." + }, + "hosting": { + "title": "2. Hosting", + "externalTitle": "External hosting", + "paragraph1": "This website is hosted by an external service provider (host). The personal data collected on this website is stored on the host's servers. This may primarily include IP addresses, contact requests, metadata and communication data, contract data, contact details, names, website access data, and other data generated through a website.", + "paragraph2": "The host is used for the purpose of fulfilling contracts with our potential and existing customers (Art. 6 para. 1 lit. b GDPR) and in the interest of secure, fast, and efficient provision of our online offering by a professional provider (Art. 6 para. 1 lit. f GDPR). If corresponding consent has been requested, processing is carried out exclusively on the basis of Art. 6 para. 1 lit. a GDPR and Section 25 para. 1 TTDSG, insofar as the consent includes the storage of cookies or access to information on the user's device (e.g. device fingerprinting) within the meaning of the TTDSG. Consent can be withdrawn at any time.", + "paragraph3": "Our host will process your data only to the extent necessary to fulfill its service obligations and will follow our instructions regarding this data.", + "providerIntro": "We use the following host:" + }, + "general": { + "title": "3. General Information and Mandatory Information", + "privacyTitle": "Data protection", + "privacyParagraph1": "The operators of these pages take the protection of your personal data very seriously. We treat your personal data confidentially and in accordance with statutory data protection regulations and this privacy policy.", + "privacyParagraph2": "When you use this website, various personal data is collected. Personal data is data with which you can be personally identified. This privacy policy explains what data we collect and what we use it for. It also explains how and for what purpose this is done.", + "privacyParagraph3": "We point out that data transmission on the internet (e.g. communication by email) may have security gaps. Complete protection of data against access by third parties is not possible.", + "responsibleTitle": "Notice concerning the responsible party", + "responsibleIntro": "The responsible party for data processing on this website is:", + "emailLabel": "Email:", + "responsibleDefinition": "The responsible party is the natural or legal person who alone or jointly with others determines the purposes and means of processing personal data (e.g. names, email addresses, etc.).", + "storageDurationTitle": "Storage duration", + "storageDurationText": "Unless a more specific storage duration has been stated within this privacy policy, your personal data will remain with us until the purpose for data processing no longer applies. If you assert a legitimate deletion request or withdraw consent to data processing, your data will be deleted unless we have other legally permissible reasons for storing your personal data (e.g. retention periods under tax or commercial law); in the latter case, deletion will take place after these reasons no longer apply.", + "legalBasisTitle": "General information on the legal bases for data processing on this website", + "legalBasisText": "If you have consented to data processing, we process your personal data on the basis of Art. 6 para. 1 lit. a GDPR or Art. 9 para. 2 lit. a GDPR, provided that special categories of data pursuant to Art. 9 para. 1 GDPR are processed. If your data is required to fulfill a contract or to carry out pre-contractual measures, we process your data on the basis of Art. 6 para. 1 lit. b GDPR. Furthermore, we process your data if this is necessary to fulfill a legal obligation on the basis of Art. 6 para. 1 lit. c GDPR. Data processing may also be carried out on the basis of our legitimate interest pursuant to Art. 6 para. 1 lit. f GDPR.", + "revocationTitle": "Withdrawal of your consent to data processing", + "revocationText": "Many data processing operations are only possible with your express consent. You may withdraw consent you have already given at any time. The lawfulness of data processing carried out before the withdrawal remains unaffected by the withdrawal.", + "objectionTitle": "Right to object to data collection in special cases and to direct advertising (Art. 21 GDPR)", + "objectionParagraph1": "If data processing is carried out on the basis of Art. 6 para. 1 lit. e or f GDPR, you have the right at any time, on grounds relating to your particular situation, to object to the processing of your personal data; this also applies to profiling based on these provisions. If you object, we will no longer process your affected personal data unless we can demonstrate compelling legitimate grounds for processing that outweigh your interests, rights, and freedoms, or processing serves the establishment, exercise, or defense of legal claims (objection pursuant to Art. 21 para. 1 GDPR).", + "objectionParagraph2": "If your personal data is processed for direct advertising purposes, you have the right to object at any time to the processing of personal data concerning you for the purpose of such advertising; this also applies to profiling insofar as it is associated with such direct advertising. If you object, your personal data will subsequently no longer be used for direct advertising purposes (objection pursuant to Art. 21 para. 2 GDPR).", + "complaintTitle": "Right to lodge a complaint with the competent supervisory authority", + "complaintText": "In the event of violations of the GDPR, data subjects have the right to lodge a complaint with a supervisory authority, in particular in the member state of their habitual residence, place of work, or place of the alleged violation. The right to lodge a complaint exists without prejudice to other administrative or judicial remedies.", + "dataPortabilityTitle": "Right to data portability", + "dataPortabilityText": "You have the right to have data that we process automatically on the basis of your consent or in fulfillment of a contract handed over to you or to a third party in a commonly used, machine-readable format. If you request the direct transfer of data to another controller, this will only be done where technically feasible.", + "encryptionTitle": "SSL or TLS encryption", + "encryptionText": "For security reasons and to protect the transmission of confidential content, such as orders or inquiries you send to us as the site operator, this site uses SSL or TLS encryption. You can recognize an encrypted connection when the browser address line changes from \"http://\" to \"https://\" and by the lock symbol in your browser line. If SSL or TLS encryption is activated, the data you transmit to us cannot be read by third parties.", + "informationDeletionCorrectionTitle": "Information, deletion, and correction", + "informationDeletionCorrectionText": "Within the scope of applicable legal provisions, you have the right at any time to free information about your stored personal data, its origin and recipients, and the purpose of data processing, and, if applicable, a right to correction or deletion of this data. You can contact us at any time regarding this or any other questions about personal data.", + "restrictionTitle": "Right to restriction of processing", + "restrictionIntro": "You have the right to request restriction of the processing of your personal data. You can contact us at any time to do so. The right to restriction of processing exists in the following cases:", + "restrictionItems": { + "accuracy": "If you dispute the accuracy of your personal data stored by us, we generally need time to verify this. For the duration of the verification, you have the right to request restriction of the processing of your personal data.", + "unlawful": "If the processing of your personal data was or is unlawful, you may request restriction of data processing instead of deletion.", + "legalClaims": "If we no longer need your personal data, but you need it to exercise, defend, or establish legal claims, you have the right to request restriction of the processing of your personal data instead of deletion.", + "objection": "If you have lodged an objection pursuant to Art. 21 para. 1 GDPR, your interests and ours must be weighed against each other. As long as it has not yet been determined whose interests prevail, you have the right to request restriction of the processing of your personal data." + }, + "restrictionOutro": "If you have restricted the processing of your personal data, this data may - apart from being stored - only be processed with your consent, for the establishment, exercise, or defense of legal claims, for the protection of the rights of another natural or legal person, or for reasons of important public interest of the European Union or a member state." + }, + "dataCollection": { + "title": "4. Data Collection on This Website", + "cookiesTitle": "Cookies", + "cookiesParagraph1": "Our websites use so-called \"cookies\". Cookies are small text files and do not cause any damage to your device. They are stored either temporarily for the duration of a session (session cookies) or permanently (persistent cookies) on your device. Session cookies are automatically deleted after your visit. Persistent cookies remain stored on your device until you delete them yourself or they are automatically deleted by your web browser.", + "cookiesParagraph2": "In some cases, cookies from third-party companies may also be stored on your device when you enter our site (third-party cookies). These enable us or you to use certain services of the third-party company (e.g. cookies for processing payment services).", + "cookiesParagraph3": "Cookies have various functions. Numerous cookies are technically necessary because certain website functions would not work without them (e.g. the shopping cart function or display of videos). Other cookies are used to evaluate user behavior or display advertising.", + "cookiesParagraph4": "Cookies required to carry out the electronic communication process, to provide certain functions you have requested, or to optimize the website (necessary cookies) are stored on the basis of Art. 6 para. 1 lit. f GDPR, unless another legal basis is specified. The website operator has a legitimate interest in storing necessary cookies for technically error-free and optimized provision of its services.", + "cookiesParagraph5": "You can configure your browser so that you are informed about the setting of cookies and only allow cookies in individual cases, exclude the acceptance of cookies for certain cases or generally, and activate automatic deletion of cookies when closing the browser. If cookies are disabled, the functionality of this website may be restricted.", + "serverLogsTitle": "Server log files", + "serverLogsIntro": "The provider of the pages automatically collects and stores information in so-called server log files, which your browser automatically transmits to us. These are:", + "serverLogItems": { + "browser": "Browser type and browser version", + "operatingSystem": "Operating system used", + "referrerUrl": "Referrer URL", + "hostName": "Host name of the accessing computer", + "requestTime": "Time of the server request", + "ipAddress": "IP address" + }, + "serverLogsText": "This data is not merged with other data sources. This data is collected on the basis of Art. 6 para. 1 lit. f GDPR. The website operator has a legitimate interest in technically error-free presentation and optimization of its website - for this purpose, server log files must be collected.", + "contactFormTitle": "Contact form", + "contactFormParagraph1": "If you send us inquiries via the contact form, your details from the inquiry form, including the contact details you provide there, will be stored by us for the purpose of processing the inquiry and in case of follow-up questions. We do not pass on this data without your consent.", + "contactFormParagraph2": "This data is processed on the basis of Art. 6 para. 1 lit. b GDPR, provided that your inquiry is related to the fulfillment of a contract or is required to carry out pre-contractual measures. In all other cases, processing is based on our legitimate interest in effectively handling inquiries addressed to us (Art. 6 para. 1 lit. f GDPR) or on your consent (Art. 6 para. 1 lit. a GDPR), if this has been requested; consent can be withdrawn at any time.", + "contactFormParagraph3": "The data you enter in the contact form will remain with us until you request deletion, withdraw your consent to storage, or the purpose for data storage no longer applies. Mandatory statutory provisions - in particular retention periods - remain unaffected." + }, + "sourceLabel": "Source:" + } + }, + "sections": { + "advantages": { + "label": "Benefits", + "title": "All other features and benefits at a glance.", + "description": "The project is publicly accessible and aims to reduce water consumption for irrigation while enabling flexible deployment planning.", + "items": { + "open": { + "label": "Open solution for everyone", + "description": "Scalable open source solution for municipalities to promote further development and transparency" + }, + "routes": { + "label": "Optimized routes", + "description": "Individual deployment planning for more efficient irrigation" + }, + "less": { + "label": "Less is more", + "description": "Targeted irrigation, lower water consumption" + } + } + }, + "architecture": { + "label": "System Architecture", + "title": "Data flow at a glance", + "description": "From measurement at the tree to the optimized irrigation route - this is how data flows through the Green Ecolution system." + }, + "challenge": { + "quote": { + "primary": "Cities water by instinct.", + "highlight": "Not by need." + }, + "description": "Urban green spaces regulate the microclimate, promote biodiversity, and strengthen location competitiveness. Yet persistent drought and a lack of digitalization are putting this asset at risk. Many municipalities base their irrigation planning solely on the assessment of individual employees, without any data basis. Instead of needs-based irrigation, watering is done across the board, wasting water while still failing to reach all trees. Unoptimized irrigation trips also cause avoidable CO₂ emissions." + }, + "contact": { + "label": "Contact", + "title": "Let's grow greener together", + "description": "Do you have questions, feedback, or a request? We look forward to your message and will get back to you as soon as possible.", + "emailAriaLabel": "Feel free to contact us by email", + "emailLabel": "Write to us" + }, + "dashboardPreview": { + "label": "Software", + "title": { + "firstLine": "Evidence-based recommendations", + "secondLine": "for irrigation at a glance" + }, + "description": "Our system uses scientific data analysis to provide evidence-based recommendations on when irrigation is necessary. The data is prepared so that it is easy to interpret and can be integrated into deployment planning.", + "imageAlt": "Green Ecolution dashboard - overview of irrigation recommendations" + }, + "demoInstance": { + "label": "Live Demo", + "title": "See for yourself", + "description": "The publicly accessible demo instance shows the current feature set: map view with traffic light system, dashboard with sensor data, and automated route calculation. No installation required, directly in the browser.", + "openDemoAriaLabel": "Open Green Ecolution demo in browser", + "openDemoLabel": "Open demo", + "imageAlt": "Green Ecolution demo, dashboard with map view and sensor data" + }, + "faq": { + "label": "FAQ", + "title": "Frequently asked questions about Green Ecolution", + "items": { + "behind": { + "question": "Who is behind the Green Ecolution project?", + "schemaAnswer": "The \"Green Ecolution\" project was launched as part of a research project in the Master's degree program \"Applied Computer Science\" at Flensburg University of Applied Sciences. After the successful completion of the research project, further development of the system is now being handled by PROGEEK in close collaboration with Smarte Grenzregion and the City of Flensburg.", + "answer": "The \"Green Ecolution\" project was launched as part of a research project in the Master's degree program \"Applied Computer Science\" at Flensburg University of Applied Sciences. After the successful completion of the research project, further development of the system is now being handled by PROGEEK in close collaboration with Smarte Grenzregion and the City of Flensburg." + }, + "value": { + "question": "What added value does the project provide?", + "schemaAnswer": "The \"Green Ecolution\" research project has shown how digital technologies can be used in a targeted way to make irrigation of urban trees more efficient, sustainable, and resource-efficient. By using modern sensor technology and intelligent data analysis, a foundation was created to significantly reduce water consumption and maintenance effort.", + "answer": { + "primary": "The \"Green Ecolution\" research project has shown how digital technologies can be used in a targeted way to make irrigation of urban trees more efficient, sustainable, and resource-efficient. By using modern sensor technology and intelligent data analysis, a foundation was created to significantly reduce water consumption and maintenance effort.", + "secondary": "The insights gained and systems developed make an important contribution to sustainable urban development in Flensburg. They support data-based decision-making and promote responsible use of natural resources - benefiting the environment, city administration, and citizens." + } + }, + "public": { + "question": "What does it mean that the project is publicly accessible?", + "schemaAnswer": "The project's source code is available in a publicly accessible GitHub repository. This means the current development status can be viewed at any time, creating transparency and enabling interested people to follow further development or actively contribute.", + "answer": { + "beforeGithub": "The project's source code is available in the public", + "afterGithub": "and can be viewed at any time. This creates transparency and enables interested people to follow further development or actively contribute.", + "beforeOpenData": "In the future, a connection to the", + "afterOpenData": "of the state of Schleswig-Holstein is also planned in order to make selected sensor data publicly accessible. This extension is currently in planning." + } + }, + "sensors": { + "question": "Which sensors are used?", + "schemaAnswer": "As part of the research project, Watermark sensors were used to measure soil water tension and SMT100 sensors were used to measure soil moisture and temperature. These sensors formed the basis for developing and testing the system.", + "answer": { + "intro": "As part of the research project, the following sensors were used to collect precise data on soil moisture and soil conditions. These sensors formed the basis for developing and testing the system.", + "watermarkPrefix": "For measuring soil water tension:", + "smt100Prefix": "For measuring soil moisture and temperature:", + "outlook": "In future development phases, the sensor technology can be further adapted or expanded depending on requirements and technological progress." + } + }, + "progress": { + "question": "What is the current progress of the project?", + "schemaAnswer": "The \"Green Ecolution\" research project was successfully completed as part of the Master's degree program \"Applied Computer Science\" at Flensburg University of Applied Sciences. In October 2025, the project received funding through the DigitalHub Call for Concepts. PROGEEK, the City of Flensburg, and Smarte Grenzregion are currently working together on further development.", + "answer": { + "beforeHs": "The \"Green Ecolution\" research project was carried out as part of the Master's degree program \"Applied Computer Science\" at", + "afterHs": "and was successfully completed. Building on the results achieved in the project, further development is now continuing.", + "beforeDigitalHub": "In October 2025, the project received funding through the", + "beforeOpenSourceProgram": "of the state program", + "afterDigitalHub": "This allows the system to be further expanded and tested in practice.", + "beforeProgeek": "Currently,", + "beforeStadtFlensburg": "the", + "beforeSmarteGrenzregion": "and", + "afterSmarteGrenzregion": "are working together on further developing and integrating the system in order to sustainably transfer the insights gained into everyday municipal practice." + } + } + } + }, + "features": { + "label": "Features", + "title": "Green Ecolution at a glance", + "description": "From sensor data collection to intelligent route planning and detailed evaluation - all features for efficient and sustainable green space management", + "items": { + "dashboard": { + "label": "Real-time dashboard", + "description": "All important KPIs at a glance: soil moisture values, upcoming tours, team availability, and vehicle status in one central dashboard." + }, + "grouping": { + "label": "Intelligent grouping", + "description": "Group trees into irrigation units. Automatic calculation of water demand per cluster." + }, + "fleet": { + "label": "Fleet management", + "description": "Manage vans and trailers with water capacities. Automatic refill stops in route planning." + }, + "tourPlanning": { + "label": "Tour planning", + "description": "Optimized irrigation plans with real-time status: from 'planned' to 'active' to 'completed'." + }, + "team": { + "label": "Team management", + "description": "Manage drivers with license classes and availability. Optimize deployment planning." + }, + "analysis": { + "label": "Post-analysis", + "description": "Document actual water consumption per cluster and tour. Analyze trends and optimize future planning based on data." + } + } + }, + "furtherLinks": { + "label": "Resources", + "title": "Further links & mentions", + "items": { + "flensburgSoftware": { + "label": "Software for the City of Flensburg", + "subLabel": "This is the software that was developed and set up for the City of Flensburg. This software is primarily used by the Technical Operations Center Flensburg." + }, + "githubOrganization": { + "label": "Organization on GitHub", + "subLabel": "There you will find all code repositories associated with the project, such as the software backend and frontend" + }, + "hsFlensburgBlog": { + "label": "Blog post by Flensburg University of Applied Sciences", + "subLabel": "A post about the research project was also published on the Flensburg University of Applied Sciences website." + }, + "hsFlensburgInstagram": { + "label": "Instagram post by Flensburg University of Applied Sciences", + "subLabel": "Green Ecolution was mentioned not only on the website, but also on Instagram." + }, + "digitalHub": { + "label": "Part of DigitalHub.SH 2025", + "subLabel": "Green Ecolution was presented and funded as one of the open source projects as part of DigitalHub.SH 2025." + }, + "flensburgPress": { + "label": "Press release by the City of Flensburg", + "subLabel": "The City of Flensburg also reported on Green Ecolution and the importance of the project for sustainable city management." + }, + "liveDemo": { + "label": "Live demo", + "subLabel": "The publicly accessible demo instance shows the current feature set: map view with traffic light system, dashboard with sensor data, and automated route calculation." + } + } + }, + "hero": { + "defaultLabel": "Project" + }, + "introduction": { + "label": "Overview", + "title": "What does smart green space management include?", + "description": "Smart green space management covers efficient monitoring and irrigation of vegetation on green spaces through the use of modern technologies such as sensors and data analysis. This enables precise control of maintenance measures adapted to specific site conditions.", + "carouselAriaLabel": "Facts about green space management", + "facts": { + "sensor": { + "label": "Development of a sensor solution", + "description": "Data on soil moisture is provided by sensors placed at different depths." + }, + "evaluation": { + "label": "Evaluation of measurement data", + "description": "Evaluation of data transmitted by sensors for needs-based irrigation of young trees." + }, + "youngTrees": { + "label": "Focus on young trees", + "description": "Young trees are especially vulnerable to heat and therefore particularly in need of protection. For this reason, trees are monitored during their first three years after planting." + }, + "locations": { + "label": "Monitoring multiple locations", + "description": "Using the LoRaWAN network, various locations can be monitored and additional ones can be added easily." + } + } + }, + "latestRelease": { + "label": "Releases", + "title": "What's new?", + "description": "We continuously develop Green Ecolution further. Take a look at the latest features, improvements, and bug fixes - and learn what we are currently working on.", + "allReleasesAriaLabel": "View all releases", + "allReleasesLabel": "All releases", + "currentLabel": "Current", + "detailsLabel": "View details" + }, + "openSourceGovernance": { + "label": "Governance", + "title": "Open source as a principle", + "description": "Transparency, independence, and reusability: the pillars of our open source strategy." + }, + "process": { + "label": "Process", + "title": "Measure. Understand. Act.", + "description": "From soil moisture to optimized irrigation route, in one continuous digital workflow.", + "stepDetails": { + "sensor": { + "depths": "Soil moisture sensors at depths of 30, 60, and 90 cm", + "measurements": "Recording soil moisture, temperature, and soil water tension", + "transmission": "Energy-efficient transmission via LoRaWAN", + "installation": "Flush-to-ground installation, no impact on maintenance work" + }, + "dashboard": { + "trafficLight": "Traffic light system shows irrigation needs on a map", + "prioritization": "Prioritization by urgency when capacity is limited", + "timelines": "Timelines for soil moisture, temperature, and water tension", + "kpis": "Real-time dashboard with all relevant KPIs" + }, + "routing": { + "planning": "Automated deployment and route planning", + "capacity": "Consideration of water capacity and vehicle size", + "restrictions": "Road and access restrictions included", + "export": "Export routes to navigation devices" + } + } + }, + "processCompact": { + "label": "Solution", + "title": "The continuous workflow", + "moreAriaLabel": "Learn more about the process", + "moreLabel": "Learn more" + }, + "sensorProbe": { + "label": "Hardware", + "title": "The soil probe", + "description": "Designed for use in public spaces. Sensors at three depths (30, 60, and 90 cm) cover a tree's entire root profile, from the shallow fine roots to the deeper main roots. This makes it possible to see whether water actually reaches the root zone or merely wets the surface. Installation is flush with the ground using standard earth augers. Maintenance work such as mowing is not affected.", + "illustrationAriaLabel": "Schematic illustration of a soil probe at three depths", + "depths": { + "fineRoots": "Fine roots", + "mainRoots": "Main roots", + "deepRoots": "Deep roots" + } + }, + "stakeholder": { + "label": "Partners & Participants", + "title": "Who are the participants?", + "description": "In collaboration between PROGEEK, Smarte Grenzregion, the City of Flensburg, and Flensburg University of Applied Sciences, a needs-based and data-driven irrigation system for trees is being built.", + "carouselAriaLabel": "Project participants", + "items": { + "progeek": { + "role": "Technical partner", + "description": "PROGEEK stands for innovative IT solutions, custom software development, and digital consulting - with the goal of supporting companies on their path into the future of digitalization." + }, + "smarteGrenzregion": { + "role": "Project coordinator", + "description": "The \"Smarte Grenzregion zwischen den Meeren\" project aims to drive digital transformation in the region in order to shape integrated and sustainable urban and regional development and strengthen the common good." + }, + "hochschuleFlensburg": { + "role": "Initiator", + "description": "Flensburg University of Applied Sciences offers practice-oriented degree programs with a focus on applied research and close collaboration with industry." + }, + "tbzFlensburg": { + "role": "Application partner", + "description": "The Technical Operations Center (TBZ) is the central service provider for the City of Flensburg and is responsible, among other things, for maintaining public green spaces, street cleaning, and waste management." + } + } + }, + "videos": { + "label": "Videos", + "title": "Get to know the project by video", + "description": "As part of the research project, not only a sensor solution and software were developed, but videos were also produced. These videos clearly illustrate the project's content, including its objectives, the problem statement, and the solution we developed.", + "cards": { + "short": { + "title": "Short video", + "description": "In this short video, we give you an initial insight into our project. Learn in just a few minutes what it is about and what you can expect from the upcoming content. Watch the video for a quick overview!", + "duration": "approx. 30 seconds" + }, + "long": { + "title": "Long video", + "description": "In this detailed video, we dive deeper into our project. Here we explain the most important details, background information, and next steps. This video gives you comprehensive information and helps you better understand the project. Enjoy watching and exploring!", + "duration": "approx. 4 minutes" + } + } + }, + "visionRoadmap": { + "label": "Vision", + "title": "Made for every municipality", + "description": { + "primary": "The platform is deliberately designed so that it can be used in any municipality. Map areas, organizational structures, and irrigation regions are freely configurable.", + "secondary": "Only open standards and open source components are used. Cloud-native architecture with Kubernetes enables multi-tenant, highly available operation. Additional municipalities can be added easily." + }, + "roadmapLabel": "Roadmap", + "futureAriaLabel": "More ideas in planning", + "futureLabel": "and much more in planning", + "status": { + "completed": "Completed", + "inProgress": "In progress", + "planned": "Planned" + } + } + } +} diff --git a/src/main.tsx b/src/main.tsx index 2d14c743..da4ca0dc 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,6 +2,7 @@ import React from 'react' import ReactDOM from 'react-dom/client' import { RouterProvider, createRouter } from '@tanstack/react-router' import { routeTree } from './routeTree.gen' +import './i18n/config' import './css/site.css' const router = createRouter({ diff --git a/src/tsx/components/BackToTop.tsx b/src/tsx/components/BackToTop.tsx index 3a1339ee..b080cb73 100644 --- a/src/tsx/components/BackToTop.tsx +++ b/src/tsx/components/BackToTop.tsx @@ -1,8 +1,10 @@ import { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' import { ArrowUp } from 'lucide-react' import { useReducedMotion } from '../hooks/useReducedMotion' function BackToTop() { + const { t } = useTranslation() const [isVisible, setIsVisible] = useState(false) const reducedMotion = useReducedMotion() @@ -27,7 +29,7 @@ function BackToTop() { return ( - Zur Startseite + {t('components.errorFallback.homeLabel')} diff --git a/src/tsx/components/cards/WelcomeCard.tsx b/src/tsx/components/cards/WelcomeCard.tsx index 71783b5c..82b21a63 100644 --- a/src/tsx/components/cards/WelcomeCard.tsx +++ b/src/tsx/components/cards/WelcomeCard.tsx @@ -1,4 +1,5 @@ import { useState, useEffect } from 'react' +import { useTranslation } from 'react-i18next' import Arrow from '../../icons/Arrow' import Lottie from 'lottie-react' import logoAnimation from '../../../json/logoAnimation.json' @@ -21,6 +22,7 @@ const WelcomeCard: React.FC = ({ }) => { const [isVisible, setIsVisible] = useState(false) const reducedMotion = useReducedMotion() + const { t } = useTranslation() const ref = useOutsideClick(() => { if (isVisible) { @@ -70,18 +72,16 @@ const WelcomeCard: React.FC = ({

- Willkommen bei - Green Ecolution + {t('welcomeCard.titlePrefix')} + {t('welcomeCard.titleHighlight')}

- Intelligentes Grünflächenmanagement + {t('welcomeCard.subtitle')}

- Erfahre, wie wir mit smarter Sensorik und datengestützten Analysen die Bewässerung - städtischer Grünflächen optimieren – für gesündere Bäume, Beete und Parks bei - effizientem Ressourceneinsatz. + {t('welcomeCard.description')}

diff --git a/src/tsx/components/hero/ContactHeroContent.tsx b/src/tsx/components/hero/ContactHeroContent.tsx index 40034221..ad39ff42 100644 --- a/src/tsx/components/hero/ContactHeroContent.tsx +++ b/src/tsx/components/hero/ContactHeroContent.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { Mail, ExternalLink, Leaf, ArrowRight } from 'lucide-react' import type { LucideIcon } from 'lucide-react' import { useReducedMotion } from '../../hooks/useReducedMotion' @@ -181,6 +182,7 @@ function ContactCard({ function ContactHeroContent() { const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() + const { t } = useTranslation() return (
@@ -212,7 +214,7 @@ function ContactHeroContent() {
- Wir freuen uns auf dich + {t('contactHero.intro')}
@@ -222,9 +224,9 @@ function ContactHeroContent() { const handleKeyDown = useCallback( @@ -60,7 +62,11 @@ function AdoptTreeModal({ data, onClose }: AdoptTreeModalProps) { if (!data) return null const colors = variantColors[data.treeVariant] - const fullName = `${data.tree.name} die ${data.tree.species}` + const species = t(data.tree.speciesKey) + const fullName = t('adoptTreeModal.fullName', { + name: data.tree.name, + species, + }) return createPortal(

- Adoptionsurkunde + {t('adoptTreeModal.certificateTitle')}

- Nr. {data.certNumber} + {t('adoptTreeModal.certificateNumber', { number: data.certNumber })}

@@ -123,7 +129,7 @@ function AdoptTreeModal({ data, onClose }: AdoptTreeModalProps) { {data.tree.emoji} {fullName}

- wartet in Flensburg auf dich + {t('adoptTreeModal.location')}

@@ -135,9 +141,11 @@ function AdoptTreeModal({ data, onClose }: AdoptTreeModalProps) { " >

- Wusstest du? + {t('adoptTreeModal.didYouKnow')} +

+

+ {t(data.factKey)}

-

{data.fact}

- „Danke, dass du an mich denkst! Mit Projekten wie Green Ecolution bekommen Stadtbäume - wie ich endlich die Aufmerksamkeit, die wir verdienen." + {t('adoptTreeModal.quote')}

- — {data.tree.name}, seit {data.plantedYear} in Flensburg + {t('adoptTreeModal.since', { + name: data.tree.name, + year: data.plantedYear, + })}

@@ -167,7 +177,7 @@ function AdoptTreeModal({ data, onClose }: AdoptTreeModalProps) { active:translate-y-0 " > - Danke, {data.tree.name}! 🌳 + {t('adoptTreeModal.button', { name: data.tree.name })} diff --git a/src/tsx/components/homepage/HomepageHero.tsx b/src/tsx/components/homepage/HomepageHero.tsx index c02b90b4..9ffc35dc 100644 --- a/src/tsx/components/homepage/HomepageHero.tsx +++ b/src/tsx/components/homepage/HomepageHero.tsx @@ -1,4 +1,5 @@ import { useState, useEffect } from 'react' +import { useTranslation } from 'react-i18next' import Arrow from '../../icons/Arrow' import HomepageOverlay from './HomepageOverlay' import HomepageHeroTrees from './HomepageHeroTrees' @@ -13,6 +14,7 @@ function HomepageHero() { const [isInitialLoad, setIsInitialLoad] = useState(false) const [isVisible, setIsVisible] = useState(false) const reducedMotion = useReducedMotion() + const { t } = useTranslation() useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect -- trigger animation on mount @@ -118,7 +120,7 @@ function HomepageHero() { > - Smart Irrigation + {t('homepageHero.label')} @@ -131,9 +133,9 @@ function HomepageHero() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '150ms' }} > - Wir ermöglichen{' '} + {t('homepageHero.headline.start')}{' '} - smarte Bewässerung + {t('homepageHero.headline.highlight')} {' '} - von Grünflächen! + {t('homepageHero.headline.end')} {/* Motto tagline */} @@ -155,7 +157,7 @@ function HomepageHero() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '250ms' }} > - Messen. Verstehen. Handeln. + {t('homepageHero.motto')}

{/* Description with stagger */} @@ -167,9 +169,7 @@ function HomepageHero() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '350ms' }} > - Mittels sensorgestützter Überwachung von Grünflächen werden Daten über das - LoRaWan-Netz übermittelt und ausgewertet, sodass Handlungsempfehlungen für die - Bewässerung abgegeben werden können. + {t('homepageHero.description')}

{/* Button with stagger */} @@ -194,7 +194,7 @@ function HomepageHero() { `} onClick={handleOpenOverlay} > - Animation abspielen + {t('homepageHero.button')} diff --git a/src/tsx/components/homepage/HomepageHeroTrees.tsx b/src/tsx/components/homepage/HomepageHeroTrees.tsx index d7647b1e..f32b9417 100644 --- a/src/tsx/components/homepage/HomepageHeroTrees.tsx +++ b/src/tsx/components/homepage/HomepageHeroTrees.tsx @@ -1,4 +1,5 @@ import { useState } from 'react' +import { useTranslation } from 'react-i18next' import Lottie from 'lottie-react' import treeLightGreenAnimation from '../../../json/treeLightGreenAnimation.json' import treeMiddleGreenAnimation from '../../../json/treeMiddleGreenAnimation.json' @@ -11,6 +12,7 @@ import type { AdoptionData } from './adoptTreeData' function HomepageHeroTrees() { const reducedMotion = useReducedMotion() const [adoption, setAdoption] = useState(null) + const { t } = useTranslation() return (
@@ -56,7 +58,7 @@ function HomepageHeroTrees() { />
@@ -199,7 +193,7 @@ const HomepageOverlay: React.FC = ({ {/* Close button */} @@ -101,7 +115,7 @@ const MainNavigation: React.FC = ({ isOpen, onClose }) => { onClick={onClose} className="transition-color ease-in-out duration-300 hover:opacity-75" > - Impressum + {t('navigation.legal.imprint')}
  • @@ -110,7 +124,7 @@ const MainNavigation: React.FC = ({ isOpen, onClose }) => { onClick={onClose} className="transition-color ease-in-out duration-300 hover:opacity-75" > - Datenschutz + {t('navigation.legal.privacy')}
  • diff --git a/src/tsx/components/releases/ReleaseCard.tsx b/src/tsx/components/releases/ReleaseCard.tsx index 0429a7c4..c109857c 100644 --- a/src/tsx/components/releases/ReleaseCard.tsx +++ b/src/tsx/components/releases/ReleaseCard.tsx @@ -1,4 +1,5 @@ import { Link } from '@tanstack/react-router' +import { useTranslation } from 'react-i18next' import type { Release } from '../../types/release' import { formatReleaseDate } from '../../helper/formatDate' @@ -10,6 +11,7 @@ interface ReleaseCardProps { const ReleaseCard: React.FC = ({ release, index = 0 }) => { const { frontmatter, slug } = release const formattedDate = formatReleaseDate(frontmatter.date) + const { t } = useTranslation() return (
    @@ -80,7 +82,9 @@ const ReleaseCard: React.FC = ({ release, index = 0 }) => { ))} {frontmatter.highlights.length > 4 && ( - +{frontmatter.highlights.length - 4} mehr + {t('releaseCard.moreHighlights', { + count: frontmatter.highlights.length - 4, + })} )} diff --git a/src/tsx/components/releases/ReleaseTimeline.tsx b/src/tsx/components/releases/ReleaseTimeline.tsx index c2c16ec2..3bba7702 100644 --- a/src/tsx/components/releases/ReleaseTimeline.tsx +++ b/src/tsx/components/releases/ReleaseTimeline.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next' import type { Release } from '../../types/release' import ReleaseCard from './ReleaseCard' @@ -6,6 +7,8 @@ interface ReleaseTimelineProps { } const ReleaseTimeline: React.FC = ({ releases }) => { + const { t } = useTranslation() + if (releases.length === 0) { return (
    @@ -24,7 +27,7 @@ const ReleaseTimeline: React.FC = ({ releases }) => { />
    -

    Es sind noch keine Release Notes vorhanden.

    +

    {t('releaseTimeline.empty')}

    ) } diff --git a/src/tsx/components/sections/Advantages.tsx b/src/tsx/components/sections/Advantages.tsx index 405e2e77..f2d54af2 100644 --- a/src/tsx/components/sections/Advantages.tsx +++ b/src/tsx/components/sections/Advantages.tsx @@ -1,25 +1,25 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useReducedMotion } from '../../hooks/useReducedMotion' import AdvantageCard from '../cards/AdvantageCard' const advantages = [ { - label: 'Offene Lösung für alle', + label: 'sections.advantages.items.open.label', icon: '/assets/svg/general/people.svg', - description: - 'Skalierbare Open-Source-Lösung für Kommunen zur Förderung von Weiterentwicklungen und Transparenz', + description: 'sections.advantages.items.open.description', accentColor: 'dark' as const, }, { - label: 'Optimierte Routen', + label: 'sections.advantages.items.routes.label', icon: '/assets/svg/general/map.svg', - description: 'Individuelle Einsatzplanung zur effizienteren Bewässerung', + description: 'sections.advantages.items.routes.description', accentColor: 'middle' as const, }, { - label: 'Weniger ist mehr', + label: 'sections.advantages.items.less.label', icon: '/assets/svg/general/reduce.svg', - description: 'Gezielte Bewässerung, weniger Wasserverbrauch', + description: 'sections.advantages.items.less.description', accentColor: 'dark' as const, }, ] @@ -49,6 +49,7 @@ function useIntersectionObserver(threshold = 0.1) { } function Advantages() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -67,17 +68,14 @@ function Advantages() { >
    - Vorteile + {t('sections.advantages.label')}

    - Alle weiteren Funktionen und Vorteile im Überblick. + {t('sections.advantages.title')}

    -

    - Das Projekt ist öffentlich einsehbar und hat als Ziel, den Wasserverbrauch für die - Bewässerung zu verringern sowie eine variable Einsatzplanung zu ermöglichen. -

    +

    {t('sections.advantages.description')}

    {/* Advantage Cards */} @@ -92,9 +90,9 @@ function Advantages() { }} > diff --git a/src/tsx/components/sections/Architecture.tsx b/src/tsx/components/sections/Architecture.tsx index 41670f7a..062a2e67 100644 --- a/src/tsx/components/sections/Architecture.tsx +++ b/src/tsx/components/sections/Architecture.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { architectureSteps } from '../../../data/architectureSteps' import { useReducedMotion } from '../../hooks/useReducedMotion' @@ -197,6 +198,7 @@ function ArchitectureCard({ isVisible: boolean reducedMotion: boolean }) { + const { t } = useTranslation() const Icon = step.icon return ( @@ -239,8 +241,10 @@ function ArchitectureCard({ {/* Content */} -

    {step.label}

    -

    {step.description}

    +

    + {t(step.label)} +

    +

    {t(step.description)}

    @@ -248,6 +252,7 @@ function ArchitectureCard({ } function Architecture() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, visibleItems, isVisible } = useStaggeredVisibility( architectureSteps.length, @@ -268,16 +273,15 @@ function Architecture() { >
    - System-Architektur + {t('sections.architecture.label')}

    - Der Datenfluss im Überblick + {t('sections.architecture.title')}

    - Von der Messung am Baum bis zur optimierten Bewässerungsroute – so fließen die Daten durch - das Green Ecolution System. + {t('sections.architecture.description')}

    diff --git a/src/tsx/components/sections/Challenge.tsx b/src/tsx/components/sections/Challenge.tsx index 37668979..b0b20cca 100644 --- a/src/tsx/components/sections/Challenge.tsx +++ b/src/tsx/components/sections/Challenge.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useReducedMotion } from '../../hooks/useReducedMotion' import { challengeFigures } from '../../../data/challengeFigures' @@ -27,6 +28,7 @@ function useIntersectionObserver(threshold = 0.1) { } function Challenge() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -73,9 +75,11 @@ function Challenge() { style={{ transitionDelay: reducedMotion ? '0ms' : '150ms' }} >

    - Städte gießen nach Gefühl. + {t('sections.challenge.quote.primary')}
    - Nicht nach Bedarf. + + {t('sections.challenge.quote.highlight')} +

    @@ -95,13 +99,7 @@ function Challenge() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '450ms' }} > - Städtische Grünflächen regulieren das Mikroklima, fördern Biodiversität und stärken den - Standortwettbewerb. Doch anhaltende Trockenheit und fehlende Digitalisierung gefährden - dieses Gut. Die Bewässerungsplanung vieler Kommunen stützt sich allein auf die - Einschätzung einzelner Mitarbeiter, ganz ohne Datengrundlage. Statt bedarfsgerechter - Bewässerung wird pauschal gegossen, was Wasser verschwendet und trotzdem nicht alle - Bäume erreicht. Nicht optimierte Bewässerungsfahrten verursachen zusätzlich vermeidbare - CO₂-Emissionen. + {t('sections.challenge.description')}

    {/* Cost Figures Grid */} @@ -120,13 +118,13 @@ function Challenge() { >
    - {figure.value} + {t(figure.value)}
    - {figure.unit} + {t(figure.unit)} -

    {figure.description}

    +

    {t(figure.description)}

    ))} diff --git a/src/tsx/components/sections/Contact.tsx b/src/tsx/components/sections/Contact.tsx index 097f83d4..640b8c46 100644 --- a/src/tsx/components/sections/Contact.tsx +++ b/src/tsx/components/sections/Contact.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { Mail } from 'lucide-react' import { useReducedMotion } from '../../hooks/useReducedMotion' @@ -170,6 +171,7 @@ function WateringAnimation({ reducedMotion }: { reducedMotion: boolean }) { } const Contact: React.FC = ({ spacingTop = true }) => { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -186,7 +188,7 @@ const Contact: React.FC = ({ spacingTop = true }) => { }`} > - Kontakt + {t('sections.contact.label')}
    @@ -220,7 +222,7 @@ const Contact: React.FC = ({ spacingTop = true }) => { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '400ms' }} > - Lass uns gemeinsam grüner werden + {t('sections.contact.title')}

    = ({ spacingTop = true }) => { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '550ms' }} > - Hast du Fragen, Feedback oder ein Anliegen? Wir freuen uns über deine Nachricht und - melden uns so schnell wie möglich bei dir. + {t('sections.contact.description')}

    diff --git a/src/tsx/components/sections/DashboardPreview.tsx b/src/tsx/components/sections/DashboardPreview.tsx index 865b45fe..05105307 100644 --- a/src/tsx/components/sections/DashboardPreview.tsx +++ b/src/tsx/components/sections/DashboardPreview.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import Lottie from 'lottie-react' import dashboardAnimation from '../../../json/dashboardAnimation.json' import { useReducedMotion } from '../../hooks/useReducedMotion' @@ -28,6 +29,7 @@ function useIntersectionObserver(threshold = 0.1) { } function DashboardPreview() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -44,7 +46,7 @@ function DashboardPreview() { }`} > - Software + {t('sections.dashboardPreview.label')}
    @@ -55,10 +57,10 @@ function DashboardPreview() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '150ms' }} > - Fundierte Handlungsempfehlungen + {t('sections.dashboardPreview.title.firstLine')}
    - zur Bewässerung auf einen Blick + {t('sections.dashboardPreview.title.secondLine')}

    - Unser System liefert anhand wissenschaftlicher Datenauswertung fundierte - Handlungsempfehlungen, zu welchem Zeitpunkt eine Bewässerung notwendig ist. Die Daten - werden dahingehend aufbereitet, dass diese einfach zu interpretieren sind und in die - Einsatzplanung eingebunden werden können. + {t('sections.dashboardPreview.description')}

    @@ -106,7 +105,7 @@ function DashboardPreview() {
    Green Ecolution Dashboard - Übersicht der Bewässerungsempfehlungen {/* Lottie animation overlay - hidden on mobile */} diff --git a/src/tsx/components/sections/DemoInstance.tsx b/src/tsx/components/sections/DemoInstance.tsx index 4669d05c..6b2b18f5 100644 --- a/src/tsx/components/sections/DemoInstance.tsx +++ b/src/tsx/components/sections/DemoInstance.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useReducedMotion } from '../../hooks/useReducedMotion' import { ExternalLink } from 'lucide-react' @@ -27,6 +28,7 @@ function useIntersectionObserver(threshold = 0.1) { } function DemoInstance() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -58,7 +60,7 @@ function DemoInstance() { }`} > - Live Demo + {t('sections.demoInstance.label')}
    @@ -69,7 +71,7 @@ function DemoInstance() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Überzeug dich selbst + {t('sections.demoInstance.title')}

    - Die öffentlich zugängliche Demo-Instanz zeigt den aktuellen Funktionsumfang: - Kartenansicht mit Ampelsystem, Dashboard mit Sensordaten und automatisierte - Routenberechnung. Keine Installation nötig, direkt im Browser. + {t('sections.demoInstance.description')}

    - Demo öffnen + {t('sections.demoInstance.openDemoLabel')}
    @@ -130,7 +130,7 @@ function DemoInstance() {
    Green Ecolution Demo, Dashboard mit Kartenansicht und Sensordaten diff --git a/src/tsx/components/sections/Faq.tsx b/src/tsx/components/sections/Faq.tsx index b24b9ee6..d7f9e9ef 100644 --- a/src/tsx/components/sections/Faq.tsx +++ b/src/tsx/components/sections/Faq.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { Trans, useTranslation } from 'react-i18next' import Accordion from '../Accordion' import { useReducedMotion } from '../../hooks/useReducedMotion' @@ -26,50 +27,46 @@ function useIntersectionObserver(threshold = 0.1) { return { ref, isVisible } } -const faqData = [ - { - question: 'Wer steckt hinter dem Projekt Green Ecolution?', - answer: - 'Das Projekt "Green Ecolution" wurde im Rahmen eines Forschungsprojekts im Masterstudiengang "Angewandte Informatik" an der Hochschule Flensburg ins Leben gerufen. Nach dem erfolgreichen Abschluss des Forschungsprojekts wird die Weiterentwicklung des Systems nun von PROGEEK übernommen, in enger Zusammenarbeit mit der Smarten Grenzregion und der Stadt Flensburg.', - }, - { - question: 'Welchen Mehrwert bietet das Projekt?', - answer: - 'Das Forschungsprojekt "Green Ecolution" hat gezeigt, wie digitale Technologien gezielt eingesetzt werden können, um die Bewässerung von Stadtbäumen effizienter, nachhaltiger und ressourcenschonender zu gestalten. Durch den Einsatz moderner Sensorik und intelligenter Datenauswertung wurde eine Grundlage geschaffen, um Wasserverbrauch und Pflegeaufwand deutlich zu reduzieren.', - }, - { - question: 'Was bedeutet es, dass das Projekt öffentlich zugänglich ist?', - answer: - 'Der Quellcode des Projekts ist in einem öffentlich zugänglichen GitHub-Repository verfügbar. Dadurch kann der aktuelle Entwicklungsstand jederzeit eingesehen werden, was Transparenz schafft und interessierten Personen ermöglicht, die Weiterentwicklung nachzuvollziehen oder sich aktiv einzubringen.', - }, - { - question: 'Welche Sensoren werden eingesetzt?', - answer: - 'Im Rahmen des Forschungsprojekts wurden Watermark-Sensoren zur Messung der Bodenwasserspannung und SMT100-Sensoren zur Messung der Bodenfeuchte und -temperatur eingesetzt. Diese Sensoren bildeten die Grundlage für die Entwicklung und Erprobung des Systems.', - }, - { - question: 'Wie ist der aktuelle Fortschritt des Projekts?', - answer: - 'Das Forschungsprojekt „Green Ecolution" wurde im Rahmen des Masterstudiengangs „Angewandte Informatik" an der Hochschule Flensburg erfolgreich abgeschlossen. Im Oktober 2025 erhielt das Projekt im Rahmen des DigitalHub Call for Concepts eine Finanzierung. Aktuell arbeiten PROGEEK, die Stadt Flensburg und die Smarte Grenzregion gemeinsam an der Weiterentwicklung.', - }, -] - -const faqSchema = { - '@context': 'https://schema.org', - '@type': 'FAQPage', - mainEntity: faqData.map((item) => ({ - '@type': 'Question', - name: item.question, - acceptedAnswer: { - '@type': 'Answer', - text: item.answer, - }, - })), -} - function Faq() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() + const faqLinkClass = + 'text-green-dark-900 font-semibold underline underline-offset-2 transition-all ease-in-out duration-300 hover:text-green-light-900' + const faqData = [ + { + question: t('sections.faq.items.behind.question'), + answer: t('sections.faq.items.behind.schemaAnswer'), + }, + { + question: t('sections.faq.items.value.question'), + answer: t('sections.faq.items.value.schemaAnswer'), + }, + { + question: t('sections.faq.items.public.question'), + answer: t('sections.faq.items.public.schemaAnswer'), + }, + { + question: t('sections.faq.items.sensors.question'), + answer: t('sections.faq.items.sensors.schemaAnswer'), + }, + { + question: t('sections.faq.items.progress.question'), + answer: t('sections.faq.items.progress.schemaAnswer'), + }, + ] + const faqSchema = { + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: faqData.map((item) => ({ + '@type': 'Question', + name: item.question, + acceptedAnswer: { + '@type': 'Answer', + text: item.answer, + }, + })), + } return (
    - FAQ + {t('sections.faq.label')}
    @@ -106,7 +103,7 @@ function Faq() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Oft gestellte Fragen zu Green Ecolution + {t('sections.faq.title')}
    @@ -168,20 +163,9 @@ function Faq() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '300ms' }} > - -

    - Das Forschungsprojekt "Green Ecolution" hat gezeigt, wie digitale Technologien gezielt - eingesetzt werden können, um die Bewässerung von Stadtbäumen effizienter, nachhaltiger - und ressourcenschonender zu gestalten. Durch den Einsatz moderner Sensorik und - intelligenter Datenauswertung wurde eine Grundlage geschaffen, um Wasserverbrauch und - Pflegeaufwand deutlich zu reduzieren. -

    -

    - Die gewonnenen Erkenntnisse und entwickelten Systeme leisten einen wichtigen Beitrag - zur nachhaltigen Stadtentwicklung in Flensburg. Sie unterstützen eine datenbasierte - Entscheidungsfindung und fördern den verantwortungsvollen Umgang mit natürlichen - Ressourcen - zum Nutzen von Umwelt, Stadtverwaltung und Bürger:innen. -

    + +

    {t('sections.faq.items.value.answer.primary')}

    +

    {t('sections.faq.items.value.answer.secondary')}

    - +

    - Der Quellcode des Projekts ist in einem öffentlich zugänglichen  + {t('sections.faq.items.public.answer.beforeGithub')}  GitHub-Repository -  verfügbar. Dadurch kann der aktuelle Entwicklungsstand jederzeit eingesehen - werden, was Transparenz schafft und interessierten Personen ermöglicht, die - Weiterentwicklung nachzuvollziehen oder sich aktiv einzubringen. +  {t('sections.faq.items.public.answer.afterGithub')}

    - Perspektivisch ist zudem eine Anbindung an das  + {t('sections.faq.items.public.answer.beforeOpenData')}  Open-Data-Portal -  des Landes Schleswig-Holstein vorgesehen, um zukünftig ausgewählte Sensordaten - öffentlich zugänglich zu machen. Diese Erweiterung befindet sich derzeit in Planung. +  {t('sections.faq.items.public.answer.afterOpenData')}

    @@ -228,15 +209,11 @@ function Faq() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '500ms' }} > - -

    - Im Rahmen des Forschungsprojekts wurden folgende Sensoren eingesetzt, um präzise Daten - zur Bodenfeuchte und -beschaffenheit zu erfassen. Diese Sensoren bildeten die - Grundlage für die Entwicklung und Erprobung des Systems. -

    + +

    {t('sections.faq.items.sensors.answer.intro')}

    -

    - In zukünftigen Entwicklungsphasen kann die Sensorik je nach Anforderungen und - technologischem Fortschritt weiter angepasst oder erweitert werden. -

    +

    {t('sections.faq.items.sensors.answer.outlook')}

    - +

    - Das Forschungsprojekt „Green Ecolution“ wurde im Rahmen des Masterstudiengangs - „Angewandte Informatik“ an der  + {t('sections.faq.items.progress.answer.beforeHs')}  Hochschule Flensburg -  erfolgreich abgeschlossen. Aufbauend auf den im Projekt erzielten Ergebnissen - wird die Weiterentwicklung nun fortgesetzt. +  {t('sections.faq.items.progress.answer.afterHs')}

    - Im Oktober 2025 erhielt das Projekt im Rahmen des  - DigitalHub Call for Concepts des Landesprogramms  + {t('sections.faq.items.progress.answer.beforeDigitalHub')}  + DigitalHub Call for Concepts  + {t('sections.faq.items.progress.answer.beforeOpenSourceProgram')}  „Offene Innovation – Open Source made in Schleswig-Holstein“ -  eine Finanzierung. Dadurch kann das System weiter ausgebaut und praxisnah - erprobt werden. +  {t('sections.faq.items.progress.answer.afterDigitalHub')}

    - Aktuell arbeiten  + {t('sections.faq.items.progress.answer.beforeProgeek')}  PROGEEK - , die  + , {t('sections.faq.items.progress.answer.beforeStadtFlensburg')}  Stadt Flensburg -  und die  +  {t('sections.faq.items.progress.answer.beforeSmarteGrenzregion')}  Smarte Grenzregion -  gemeinsam an der Weiterentwicklung und Integration des Systems, um die - gewonnenen Erkenntnisse nachhaltig in den kommunalen Alltag zu überführen. +  {t('sections.faq.items.progress.answer.afterSmarteGrenzregion')}

    diff --git a/src/tsx/components/sections/Features.tsx b/src/tsx/components/sections/Features.tsx index 15d28ab4..3c9ff0fb 100644 --- a/src/tsx/components/sections/Features.tsx +++ b/src/tsx/components/sections/Features.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { TreeDeciduous, Truck, @@ -93,51 +94,46 @@ function FeatureCard({ feature }: { feature: Feature }) { } function Features() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() const features: Feature[] = [ { - label: 'Echtzeit-Dashboard', + label: t('sections.features.items.dashboard.label'), icon: , - description: - 'Alle wichtigen KPIs auf einen Blick: Bodenfeuchtewerte, anstehende Touren, Teamverfügbarkeit und Fahrzeugstatus in einem zentralen Dashboard.', + description: t('sections.features.items.dashboard.description'), color: 'green-dark', size: 'large', }, { - label: 'Intelligente Gruppierung', + label: t('sections.features.items.grouping.label'), icon: , - description: - 'Fasse Bäume zu Bewässerungs\u00ADeinheiten zusammen. Automatische Berechnung des Wasserbedarfs pro Cluster.', + description: t('sections.features.items.grouping.description'), color: 'green-light', }, { - label: 'Fleet Management', + label: t('sections.features.items.fleet.label'), icon: , - description: - 'Verwalte Transporter und Anhänger mit Wasserkapazitäten. Automatische Nachfüllstopps in der Routenplanung.', + description: t('sections.features.items.fleet.description'), color: 'green-middle', }, { - label: 'Tour-Planung', + label: t('sections.features.items.tourPlanning.label'), icon: , - description: - "Optimierte Bewässerungspläne mit Echtzeit-Status: Von 'geplant' über 'aktiv' bis 'abgeschlossen'.", + description: t('sections.features.items.tourPlanning.description'), color: 'green-middle', }, { - label: 'Teamverwaltung', + label: t('sections.features.items.team.label'), icon: , - description: - 'Verwalte Fahrer mit Führerscheinklassen und Verfügbarkeit. Optimiere die Einsatzplanung.', + description: t('sections.features.items.team.description'), color: 'green-light', }, { - label: 'Nachanalyse', + label: t('sections.features.items.analysis.label'), icon: , - description: - 'Dokumentiere den tatsächlichen Wasserverbrauch pro Cluster und Tour. Analysiere Trends und optimiere zukünftige Planungen datenbasiert.', + description: t('sections.features.items.analysis.description'), color: 'green-dark', size: 'large', }, @@ -159,7 +155,7 @@ function Features() { >
    - Features + {t('sections.features.label')}
    @@ -174,7 +170,7 @@ function Features() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Green Ecolution im Überblick + {t('sections.features.title')}

    - Von der Sensorerfassung über die intelligente Routenplanung bis zur detaillierten - Auswertung - alle Funktionen für ein effizientes und nachhaltiges Grünflächenmanagement + {t('sections.features.description')}

    diff --git a/src/tsx/components/sections/FurhterLinks.tsx b/src/tsx/components/sections/FurhterLinks.tsx index a20d15dd..012d1b87 100644 --- a/src/tsx/components/sections/FurhterLinks.tsx +++ b/src/tsx/components/sections/FurhterLinks.tsx @@ -1,48 +1,42 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useReducedMotion } from '../../hooks/useReducedMotion' import { ArrowUpRight } from 'lucide-react' const links = [ { - label: 'Software für die Stadt Flensburg', - subLabel: - 'Dies ist die Software, die für die Stadt Flensburg entwickelt und aufgesetzt wurde. Diese Software wird primär vom Technischen Betriebszentrum Flensburg genutzt.', + label: 'sections.furtherLinks.items.flensburgSoftware.label', + subLabel: 'sections.furtherLinks.items.flensburgSoftware.subLabel', url: 'https://app.green-ecolution.de/', }, { - label: 'Organisation auf GitHub', - subLabel: - 'Dort finden Sie alle Code-Repositories, die mit dem Projekt in Verbindung stehen, wie z. B. Backend und Frontend der Software', + label: 'sections.furtherLinks.items.githubOrganization.label', + subLabel: 'sections.furtherLinks.items.githubOrganization.subLabel', url: 'https://github.com/green-ecolution', }, { - label: 'Blog-Beitrag der HS Flensburg', - subLabel: - 'Auch auf der Website der HS Flensburg wurde ein Beitrag zum Forschungsprojekt veröffentlicht.', + label: 'sections.furtherLinks.items.hsFlensburgBlog.label', + subLabel: 'sections.furtherLinks.items.hsFlensburgBlog.subLabel', url: 'https://hs-flensburg.de/studium/master/ai/abgeschlossene-arbeiten/green-ecolution-smartes-gruenflaechenmanagement-fuer-die', }, { - label: 'Instagram-Beitrag der HS Flensburg', - subLabel: - 'Nicht nur auf der Website, sondern auch auf Instagram wurde Green Ecolution erwähnt.', + label: 'sections.furtherLinks.items.hsFlensburgInstagram.label', + subLabel: 'sections.furtherLinks.items.hsFlensburgInstagram.subLabel', url: 'https://www.instagram.com/hochschuleflensburg/p/DA3aCgaPqoq/', }, { - label: 'Teil des DigitalHub.SH 2025', - subLabel: - 'Green Ecolution wurde als eines der Open-Source-Projekte im Rahmen des DigitalHub.SH 2025 vorgestellt und finanziert.', + label: 'sections.furtherLinks.items.digitalHub.label', + subLabel: 'sections.furtherLinks.items.digitalHub.subLabel', url: 'https://www.schleswig-holstein.de/DE/landesregierung/ministerien-behoerden/I/Presse/PI/2025/cds/251014_cds_open-source-projekte?nn=a3865cbf-b1fb-4b2f-bc47-f7ac05f3f7b5', }, { - label: 'Pressemitteilung der Stadt Flensburg', - subLabel: - 'Auch die Stadt Flensburg berichtete über Green Ecolution und die Bedeutung des Projekts für ein nachhaltiges Stadtmanagement.', + label: 'sections.furtherLinks.items.flensburgPress.label', + subLabel: 'sections.furtherLinks.items.flensburgPress.subLabel', url: 'https://www.presse-service.de/data.aspx/static/1200128.html', }, { - label: 'Live Demo', - subLabel: - 'Die öffentlich zugängliche Demo-Instanz zeigt den aktuellen Funktionsumfang: Kartenansicht mit Ampelsystem, Dashboard mit Sensordaten und automatisierte Routenberechnung.', + label: 'sections.furtherLinks.items.liveDemo.label', + subLabel: 'sections.furtherLinks.items.liveDemo.subLabel', url: 'https://demo.green-ecolution.de/', }, ] @@ -72,6 +66,7 @@ function useIntersectionObserver(threshold = 0.1) { } function FurtherLinks() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -88,12 +83,12 @@ function FurtherLinks() { >
    - Ressourcen + {t('sections.furtherLinks.label')}

    - Weiterführende Links & Erwähnungen + {t('sections.furtherLinks.title')}

    @@ -120,9 +115,9 @@ function FurtherLinks() {

    - {link.label} + {t(link.label)}

    -

    {link.subLabel}

    +

    {t(link.subLabel)}

    diff --git a/src/tsx/components/sections/Hero.tsx b/src/tsx/components/sections/Hero.tsx index 1f93aea9..a6c53ae6 100644 --- a/src/tsx/components/sections/Hero.tsx +++ b/src/tsx/components/sections/Hero.tsx @@ -1,4 +1,5 @@ import React, { ReactNode, useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useReducedMotion } from '../../hooks/useReducedMotion' interface HeroProps { @@ -8,7 +9,8 @@ interface HeroProps { children?: ReactNode } -const Hero: React.FC = ({ headline, description, label = 'Projekt', children }) => { +const Hero: React.FC = ({ headline, description, label, children }) => { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const [isVisible, setIsVisible] = useState(false) @@ -27,7 +29,7 @@ const Hero: React.FC = ({ headline, description, label = 'Projekt', c }`} > - {label} + {label ?? t('sections.hero.defaultLabel')}
    diff --git a/src/tsx/components/sections/Introduction.tsx b/src/tsx/components/sections/Introduction.tsx index 3c5e15f3..dc39321f 100644 --- a/src/tsx/components/sections/Introduction.tsx +++ b/src/tsx/components/sections/Introduction.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { Splide, SplideSlide } from '@splidejs/react-splide' import { i18nTranslated } from '../../helper/sliderTranslations' import '@splidejs/react-splide/css' @@ -30,32 +31,29 @@ function useIntersectionObserver(threshold = 0.1) { } function Introduction() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() const facts = [ { - label: 'Entwicklung einer Sensorlösung', + label: t('sections.introduction.facts.sensor.label'), icon: '/assets/svg/general/sensor.svg', - description: - 'Daten zur Bodenfeuchte werden mithilfe von in unterschiedlicher Tiefe platzierten Sensoren geliefert.', + description: t('sections.introduction.facts.sensor.description'), }, { - label: 'Auswertung der Messdaten', + label: t('sections.introduction.facts.evaluation.label'), icon: '/assets/svg/general/statistics.svg', - description: - 'Auswertung der durch Sensoren übermittelten Daten für eine bedarfsgerechte Bewässerung von Jungbäumen.', + description: t('sections.introduction.facts.evaluation.description'), }, { - label: 'Augenmerk auf Jungbäume', + label: t('sections.introduction.facts.youngTrees.label'), icon: '/assets/svg/general/tree.svg', - description: - 'Jungbäume sind besonders hitzeanfällig und daher äußerst schutzbedürftig. Aus diesem Grund werden Bäume in deren ersten drei Standjahren überwacht.', + description: t('sections.introduction.facts.youngTrees.description'), }, { - label: 'Monitoring mehrerer Standorte', + label: t('sections.introduction.facts.locations.label'), icon: '/assets/svg/general/location.svg', - description: - 'Unter Verwendung des LoRaWan-Netzes können verschiedene Standorte überwacht und weitere einfach eingebunden werden.', + description: t('sections.introduction.facts.locations.description'), }, ] @@ -84,7 +82,7 @@ function Introduction() { >
    - Überblick + {t('sections.introduction.label')}
    @@ -98,7 +96,7 @@ function Introduction() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Was beinhaltet smartes Grünflächenmanagement? + {t('sections.introduction.title')}

    - Smartes Grünflächenmanagement umfasst die effiziente Überwachung und Bewässerung von - Vegetation auf Grünflächen durch den Einsatz moderner Technologien wie Sensoren und - Datenanalyse. Dadurch wird eine präzise Steuerung der Pflegemaßnahmen ermöglicht, die - angepasst sind an die spezifischen Standortbedingungen. + {t('sections.introduction.description')}

    @@ -131,7 +126,7 @@ function Introduction() { breakpoints: breakpoints, reducedMotion: { speed: 0, rewindSpeed: 0 }, }} - aria-label="Fakten zum Grünflächenmanagement" + aria-label={t('sections.introduction.carouselAriaLabel')} className="splide--grid md:px-2" > {facts.map((fact) => ( diff --git a/src/tsx/components/sections/LatestRelease.tsx b/src/tsx/components/sections/LatestRelease.tsx index b16055d3..1a6845ee 100644 --- a/src/tsx/components/sections/LatestRelease.tsx +++ b/src/tsx/components/sections/LatestRelease.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { Link } from '@tanstack/react-router' import { getAllReleases } from '../../../content/releases' import Button from '../Button' @@ -31,6 +32,7 @@ function useIntersectionObserver(threshold = 0.1) { } function LatestRelease() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() const releases = getAllReleases() @@ -57,7 +59,7 @@ function LatestRelease() { >
    - Releases + {t('sections.latestRelease.label')}
    @@ -71,7 +73,7 @@ function LatestRelease() { `} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Was gibt's Neues? + {t('sections.latestRelease.title')}

    - Wir entwickeln Green Ecolution kontinuierlich weiter. Schau dir die neuesten Funktionen, - Verbesserungen und Bugfixes an – und erfahre, woran wir gerade arbeiten. + {t('sections.latestRelease.description')}

    -
    @@ -115,7 +120,7 @@ function LatestRelease() { v{latestRelease.frontmatter.version} - Aktuell + {t('sections.latestRelease.currentLabel')}
    @@ -115,14 +116,14 @@ function OpenSourceGovernance() {
    - {pillar.category} + {t(pillar.category)}

    - {pillar.title} + {t(pillar.title)}

    -

    {pillar.description}

    +

    {t(pillar.description)}

    ) })} diff --git a/src/tsx/components/sections/Process.tsx b/src/tsx/components/sections/Process.tsx index 2035e9b3..529b61f6 100644 --- a/src/tsx/components/sections/Process.tsx +++ b/src/tsx/components/sections/Process.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { workflowSteps } from '../../../data/workflowSteps' import { useReducedMotion } from '../../hooks/useReducedMotion' @@ -28,26 +29,27 @@ function useIntersectionObserver(threshold = 0.1) { const stepDetails: string[][] = [ [ - 'Bodenfeuchtesensoren in 30, 60 und 90 cm Tiefe', - 'Erfassung von Bodenfeuchte, Temperatur und Bodenwasserspannung', - 'Energieeffiziente Übertragung über LoRaWAN', - 'Bodenbündige Installation, kein Einfluss auf Pflegearbeiten', + 'sections.process.stepDetails.sensor.depths', + 'sections.process.stepDetails.sensor.measurements', + 'sections.process.stepDetails.sensor.transmission', + 'sections.process.stepDetails.sensor.installation', ], [ - 'Ampelsystem zeigt Bewässerungsbedarf auf einer Karte', - 'Priorisierung nach Dringlichkeit bei begrenzten Kapazitäten', - 'Zeitverläufe für Bodenfeuchte, Temperatur und Wasserspannung', - 'Echtzeit-Dashboard mit allen relevanten KPIs', + 'sections.process.stepDetails.dashboard.trafficLight', + 'sections.process.stepDetails.dashboard.prioritization', + 'sections.process.stepDetails.dashboard.timelines', + 'sections.process.stepDetails.dashboard.kpis', ], [ - 'Automatisierte Einsatz- und Routenplanung', - 'Berücksichtigung von Wasserkapazität und Fahrzeuggröße', - 'Straßen- und Zufahrtsrestriktionen einbezogen', - 'Export der Routen auf Navigationsgeräte', + 'sections.process.stepDetails.routing.planning', + 'sections.process.stepDetails.routing.capacity', + 'sections.process.stepDetails.routing.restrictions', + 'sections.process.stepDetails.routing.export', ], ] function Process() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -65,7 +67,7 @@ function Process() { }`} > - Prozess + {t('sections.process.label')}
    @@ -76,7 +78,7 @@ function Process() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Messen. Verstehen. Handeln. + {t('sections.process.title')}

    - Von der Bodenfeuchte zur optimierten Bewässerungsroute, in einem durchgängigen digitalen - Workflow. + {t('sections.process.description')}

    @@ -114,16 +115,16 @@ function Process() {
    - {step.number} · {step.category} + {step.number} · {t(step.category)}

    - {step.title} + {t(step.title)}

    - {step.description} + {t(step.description)}

    @@ -134,7 +135,9 @@ function Process() { {details.map((detail) => (
  • - {detail} + + {t(detail)} +
  • ))} diff --git a/src/tsx/components/sections/ProcessCompact.tsx b/src/tsx/components/sections/ProcessCompact.tsx index d5db31db..79cb4bbf 100644 --- a/src/tsx/components/sections/ProcessCompact.tsx +++ b/src/tsx/components/sections/ProcessCompact.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { Link } from '@tanstack/react-router' import { workflowSteps } from '../../../data/workflowSteps' import Arrow from '../../icons/Arrow' @@ -29,6 +30,7 @@ function useIntersectionObserver(threshold = 0.1) { } function ProcessCompact() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -46,7 +48,7 @@ function ProcessCompact() { }`} > - Lösung + {t('sections.processCompact.label')}
    @@ -57,20 +59,20 @@ function ProcessCompact() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Der durchgängige Workflow + {t('sections.processCompact.title')}
    - Mehr erfahren + {t('sections.processCompact.moreLabel')} @@ -100,14 +102,14 @@ function ProcessCompact() { - {step.number} · {step.category} + {step.number} · {t(step.category)}

    - {step.title} + {t(step.title)}

    -

    {step.description}

    +

    {t(step.description)}

    ) })} @@ -124,10 +126,10 @@ function ProcessCompact() { - Mehr erfahren + {t('sections.processCompact.moreLabel')} diff --git a/src/tsx/components/sections/SensorProbe.tsx b/src/tsx/components/sections/SensorProbe.tsx index d4e1cf2a..13cbdba3 100644 --- a/src/tsx/components/sections/SensorProbe.tsx +++ b/src/tsx/components/sections/SensorProbe.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useReducedMotion } from '../../hooks/useReducedMotion' import { sensorSpecs, sensorFeatures } from '../../../data/sensorSpecs' @@ -33,10 +34,11 @@ function SoilIllustration({ isVisible: boolean reducedMotion: boolean }) { + const { t } = useTranslation() const depths = [ - { y: 120, label: '30 cm', color: '#658A58', zone: 'Feinwurzeln' }, - { y: 200, label: '60 cm', color: '#4C7741', zone: 'Hauptwurzeln' }, - { y: 280, label: '90 cm', color: '#3D5F35', zone: 'Tiefenwurzeln' }, + { y: 120, label: '30 cm', color: '#658A58', zone: t('sections.sensorProbe.depths.fineRoots') }, + { y: 200, label: '60 cm', color: '#4C7741', zone: t('sections.sensorProbe.depths.mainRoots') }, + { y: 280, label: '90 cm', color: '#3D5F35', zone: t('sections.sensorProbe.depths.deepRoots') }, ] return ( @@ -45,7 +47,7 @@ function SoilIllustration({ className={`w-full max-w-sm mx-auto transition-all ${reducedMotion ? '' : 'duration-1000'} ${ isVisible ? 'opacity-100 scale-100' : 'opacity-0 scale-95' }`} - aria-label="Schematische Darstellung einer Bodensonde in drei Tiefen" + aria-label={t('sections.sensorProbe.illustrationAriaLabel')} role="img" > {/* Sky */} @@ -251,6 +253,7 @@ function SoilIllustration({ } function SensorProbe() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -276,7 +279,7 @@ function SensorProbe() { }`} > - Hardware + {t('sections.sensorProbe.label')}
    @@ -288,7 +291,7 @@ function SensorProbe() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Die Bodensonde + {t('sections.sensorProbe.title')} {/* Description */} @@ -298,12 +301,7 @@ function SensorProbe() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '200ms' }} > - Konzipiert für den Einsatz im öffentlichen Raum. Sensoren in drei Tiefen (30, 60 und 90 - cm) bilden das gesamte Wurzelprofil eines Baumes ab, von den oberflächennahen - Feinwurzeln bis zu den tieferen Hauptwurzeln. So lässt sich erkennen, ob Wasser - tatsächlich im Wurzelbereich ankommt oder nur die Oberfläche benetzt wird. Die - Installation erfolgt bodenbündig mit handelsüblichen Erdbohrern. Pflegearbeiten wie - Mähen werden nicht beeinträchtigt. + {t('sections.sensorProbe.description')}

    {/* Spec Badges */} @@ -319,7 +317,7 @@ function SensorProbe() { className="flex items-center gap-2 border border-green-light-900/40 rounded-full px-4 py-2 transition-all duration-300 hover:border-green-light-900 hover:bg-green-light-100/50 hover:shadow-sm cursor-default" > {spec.value} - {spec.label} + {t(spec.label)} ))} @@ -343,9 +341,11 @@ function SensorProbe() {

    - {feature.label} + {t(feature.label)}

    -

    {feature.description}

    +

    + {t(feature.description)} +

    ) diff --git a/src/tsx/components/sections/Stakeholder.tsx b/src/tsx/components/sections/Stakeholder.tsx index f737c75b..36959712 100644 --- a/src/tsx/components/sections/Stakeholder.tsx +++ b/src/tsx/components/sections/Stakeholder.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { Splide, SplideSlide } from '@splidejs/react-splide' import { i18nTranslated } from '../../helper/sliderTranslations' import '@splidejs/react-splide/css' @@ -34,41 +35,38 @@ function useIntersectionObserver(threshold = 0.1) { } const Stakeholder: React.FC = ({ hasDesktopList = false }) => { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() const stakeholder = [ { label: 'PROGEEK GmbH', - role: 'Technischer Partner', + role: t('sections.stakeholder.items.progeek.role'), url: 'https://progeek.de/', image: '/assets/images/logo/progeek.svg', - description: - 'PROGEEK steht für innovative IT-Lösungen, individuelle Softwareentwicklung und digitale Beratung – mit dem Ziel, Unternehmen auf ihrem Weg in die Zukunft der Digitalisierung zu begleiten.', + description: t('sections.stakeholder.items.progeek.description'), }, { label: 'Smarte Grenzregion', - role: 'Projektkoordinator', + role: t('sections.stakeholder.items.smarteGrenzregion.role'), url: 'https://smarte-grenzregion.de/', image: '/assets/images/logo/smarte-grenzregion.png', - description: - 'Das Projekt „Smarte Grenzregion zwischen den Meeren" will die digitale Transformation in der Region vorantreiben, um eine integrierte und nachhaltige Stadt- und Regionalentwicklung zu gestalten und das Gemeinwohl zu stärken.', + description: t('sections.stakeholder.items.smarteGrenzregion.description'), }, { label: 'Hochschule Flensburg', - role: 'Initiator', + role: t('sections.stakeholder.items.hochschuleFlensburg.role'), url: 'https://hs-flensburg.de/', image: '/assets/images/logo/hochschule-flensburg.png', - description: - 'Die Hochschule Flensburg bietet praxisnahe Studiengänge mit Fokus auf angewandte Forschung und enge Zusammenarbeit mit der Industrie an.', + description: t('sections.stakeholder.items.hochschuleFlensburg.description'), }, { label: 'TBZ Flensburg', - role: 'Anwendungspartner', + role: t('sections.stakeholder.items.tbzFlensburg.role'), url: 'https://www.tbz-flensburg.de/', image: '/assets/images/logo/tbz.png', - description: - 'Das Technische Betriebszentrum (TBZ) ist der zentrale Dienstleister für die Stadt Flensburg und u.a. für die Pflege öffentlicher Grünflächen, Straßenreinigung sowie Abfallwirtschaft zuständig.', + description: t('sections.stakeholder.items.tbzFlensburg.description'), }, ] @@ -96,7 +94,7 @@ const Stakeholder: React.FC = ({ hasDesktopList = false }) => >
    - Partner & Beteiligte + {t('sections.stakeholder.label')}
    = ({ hasDesktopList = false }) => `} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Wer sind die Beteiligten? + {t('sections.stakeholder.title')}

    = ({ hasDesktopList = false }) => `} style={{ transitionDelay: reducedMotion ? '0ms' : '200ms' }} > - In Zusammenarbeit zwischen PROGEEK, der Smarten-Grenzregion, der Stadt Flensburg und der - Hochschule Flensburg soll eine bedarfsgerechte und datenbasierte Bewässerung für Bäume - aufgebaut werden. + {t('sections.stakeholder.description')}

    @@ -147,7 +143,7 @@ const Stakeholder: React.FC = ({ hasDesktopList = false }) => ...(hasDesktopList && { breakpoints: breakpoints }), reducedMotion: { speed: 0, rewindSpeed: 0 }, }} - aria-label="Beteiligten am Projekt" + aria-label={t('sections.stakeholder.carouselAriaLabel')} > {stakeholder.map((company, index) => ( diff --git a/src/tsx/components/sections/Videos.tsx b/src/tsx/components/sections/Videos.tsx index da7ec58b..1ef1b48c 100644 --- a/src/tsx/components/sections/Videos.tsx +++ b/src/tsx/components/sections/Videos.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import ReactPlayer from 'react-player' import VideoPreview from '../VideoPreview' import { useReducedMotion } from '../../hooks/useReducedMotion' @@ -72,6 +73,7 @@ const VideoCard = (props: { ) const Videos = () => { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -91,7 +93,7 @@ const Videos = () => { >
    - Videos + {t('sections.videos.label')}
    @@ -105,7 +107,7 @@ const Videos = () => { `} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Lerne das Projekt per Video kennen + {t('sections.videos.title')}

    { `} style={{ transitionDelay: reducedMotion ? '0ms' : '200ms' }} > - Im Rahmen des Forschungsprojekts wurden nicht nur eine Sensorlösung und eine Software - entwickelt, sondern auch Videos produziert. Diese Videos veranschaulichen anschaulich die - Inhalte des Projekts, einschließlich der Zielsetzung, der Problemstellung und der von uns - entwickelten Lösung. + {t('sections.videos.description')}

    @@ -133,9 +132,9 @@ const Videos = () => {
    {
    diff --git a/src/tsx/components/sections/VisionRoadmap.tsx b/src/tsx/components/sections/VisionRoadmap.tsx index c79d8f57..a4f4449d 100644 --- a/src/tsx/components/sections/VisionRoadmap.tsx +++ b/src/tsx/components/sections/VisionRoadmap.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useReducedMotion } from '../../hooks/useReducedMotion' import { roadmapItems } from '../../../data/roadmapItems' @@ -26,27 +27,27 @@ function useIntersectionObserver(threshold = 0.1) { return { ref, isVisible } } -const statusConfig = { - completed: { - dot: 'bg-green-dark-900', - label: 'Abgeschlossen', - labelColor: 'text-green-dark-900', - }, - 'in-progress': { - dot: 'bg-green-light-900 animate-pulse', - label: 'In Arbeit', - labelColor: 'text-green-light-900', - }, - planned: { - dot: 'bg-grey-900/30', - label: 'Geplant', - labelColor: 'text-grey-600', - }, -} - function VisionRoadmap() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() + const statusConfig = { + completed: { + dot: 'bg-green-dark-900', + label: t('sections.visionRoadmap.status.completed'), + labelColor: 'text-green-dark-900', + }, + 'in-progress': { + dot: 'bg-green-light-900 animate-pulse', + label: t('sections.visionRoadmap.status.inProgress'), + labelColor: 'text-green-light-900', + }, + planned: { + dot: 'bg-grey-900/30', + label: t('sections.visionRoadmap.status.planned'), + labelColor: 'text-grey-600', + }, + } return (
    - Vision + {t('sections.visionRoadmap.label')}
    @@ -77,7 +78,7 @@ function VisionRoadmap() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '100ms' }} > - Für jede Kommune gemacht + {t('sections.visionRoadmap.title')}

    - Die Plattform ist bewusst so gestaltet, dass sie in jeder Kommune eingesetzt werden - kann. Kartenbereiche, Organisationsstrukturen und Bewässerungsregionen sind frei - konfigurierbar. + {t('sections.visionRoadmap.description.primary')}

    - Es werden ausschließlich offene Standards und Open-Source-Komponenten verwendet. - Cloud-native Architektur mit Kubernetes ermöglicht einen mandantenfähigen, - hochverfügbaren Betrieb. Weitere Kommunen können leicht hinzugefügt werden. + {t('sections.visionRoadmap.description.secondary')}

    @@ -107,7 +104,7 @@ function VisionRoadmap() { }`} style={{ transitionDelay: reducedMotion ? '0ms' : '300ms' }} > - Roadmap + {t('sections.visionRoadmap.roadmapLabel')}
    @@ -138,7 +135,7 @@ function VisionRoadmap() {

    - {item.title} + {t(item.title)}

    -

    {item.description}

    +

    {t(item.description)}

    ) @@ -160,7 +157,7 @@ function VisionRoadmap() { style={{ transitionDelay: reducedMotion ? '0ms' : `${350 + roadmapItems.length * 120}ms`, }} - aria-label="Weitere Ideen in Planung" + aria-label={t('sections.visionRoadmap.futureAriaLabel')} > {/* Diminishing dots along a fading timeline — continuation metaphor */}
    ··· - und vieles mehr in Planung + {t('sections.visionRoadmap.futureLabel')}

    diff --git a/src/tsx/helper/sliderTranslations.ts b/src/tsx/helper/sliderTranslations.ts index 14ba45ae..6ae371a4 100644 --- a/src/tsx/helper/sliderTranslations.ts +++ b/src/tsx/helper/sliderTranslations.ts @@ -1,13 +1,15 @@ +import i18next from '../../i18n/config' + // German translations for reusable splide slider export const i18nTranslated = { - prev: 'Vorheriges Element anzeigen', - next: 'Nächstes Element anzeigen', - first: 'Erstes Element anzeigen', - last: 'Letztes Element anzeigen', - slideX: 'Zu Seite %s springen', - pageX: 'Zu Seite %s springen', - carousel: 'Slider', - select: 'Paginierung der Elemente', - slide: 'Slider Element', - slideLabel: '%s von %s', + prev: i18next.t('helper.sliderTranslations.prev'), + next: i18next.t('helper.sliderTranslations.next'), + first: i18next.t('helper.sliderTranslations.first'), + last: i18next.t('helper.sliderTranslations.last'), + slideX: i18next.t('helper.sliderTranslations.slideX'), + pageX: i18next.t('helper.sliderTranslations.pageX'), + carousel: i18next.t('helper.sliderTranslations.carousel'), + select: i18next.t('helper.sliderTranslations.select'), + slide: i18next.t('helper.sliderTranslations.slide'), + slideLabel: i18next.t('helper.sliderTranslations.slideLabel'), } diff --git a/src/tsx/layout/Footer.tsx b/src/tsx/layout/Footer.tsx index 824dd926..95dcb269 100644 --- a/src/tsx/layout/Footer.tsx +++ b/src/tsx/layout/Footer.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' import { Link } from '@tanstack/react-router' import Button from '../components/Button' import { useReducedMotion } from '../hooks/useReducedMotion' @@ -28,6 +29,7 @@ function useIntersectionObserver(threshold = 0.1) { } function Footer() { + const { t } = useTranslation() const reducedMotion = useReducedMotion() const { ref, isVisible } = useIntersectionObserver() @@ -44,27 +46,26 @@ function Footer() { ${isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'} `} > - + Logo Green Ecolution -

    - Green Ecolution ist ein digitales System zur bedarfsgerechten und ressourcenschonenden - Bewässerung von Stadtbäumen und leistet damit einen Beitrag zu einer nachhaltigen und - klimaresilienten Stadtentwicklung. -

    +

    {t('layout.footer.description')}

    -
    diff --git a/src/tsx/pages/ProjectPage.tsx b/src/tsx/pages/ProjectPage.tsx index 07113a76..324b262e 100644 --- a/src/tsx/pages/ProjectPage.tsx +++ b/src/tsx/pages/ProjectPage.tsx @@ -1,4 +1,5 @@ import { useEffect } from 'react' +import { useTranslation } from 'react-i18next' import Advantages from '../components/sections/Advantages' import Architecture from '../components/sections/Architecture' import DashboardPreview from '../components/sections/DashboardPreview' @@ -12,9 +13,11 @@ import VisionRoadmap from '../components/sections/VisionRoadmap' import BreadcrumbSchema from '../components/BreadcrumbSchema' function ProjectPage() { + const { t } = useTranslation() + useEffect(() => { - document.title = 'Projekt | Green Ecolution | Smartes Grünflächenmanagement' - }, []) + document.title = t('pages.project.documentTitle') + }, [t]) useEffect(() => { const hash = window.location.hash @@ -26,11 +29,8 @@ function ProjectPage() { } }, []) - const heroHeadline = 'Smartes Grünflächenmanagement für lebenswerte Städte' - const heroDescription = - 'Green Ecolution ist eine Open-Source-Lösung für die effiziente Bewässerung urbaner Bäume. \ - Unsere Software kombiniert Sensordaten mit intelligenter Routenoptimierung und ermöglicht so eine gezielte, \ - ressourcenschonende Einsatzplanung. Entwickelt in Zusammenarbeit mit der Stadt Flensburg – bald auch verfügbar für deine Kommune.' + const heroHeadline = t('pages.project.hero.headline') + const heroDescription = t('pages.project.hero.description') return (
    diff --git a/src/tsx/pages/ReleaseDetailPage.tsx b/src/tsx/pages/ReleaseDetailPage.tsx index 6118410a..07ec8c10 100644 --- a/src/tsx/pages/ReleaseDetailPage.tsx +++ b/src/tsx/pages/ReleaseDetailPage.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState, type ReactNode } from 'react' +import { useTranslation } from 'react-i18next' import { Link, redirect } from '@tanstack/react-router' import Markdown from 'react-markdown' import { getReleaseBySlug, getAdjacentReleases, getAllReleases } from '../../content/releases' @@ -43,6 +44,7 @@ function useIntersectionObserver(threshold = 0.1) { } function ReleaseDetailPage() { + const { t } = useTranslation() const { slug } = Route.useParams() const release = getReleaseBySlug(slug) const { prev, next } = getAdjacentReleases(slug) @@ -54,9 +56,12 @@ function ReleaseDetailPage() { useEffect(() => { if (release) { - document.title = `v${release.frontmatter.version} - ${release.frontmatter.title} | Green Ecolution` + document.title = t('pages.releaseDetail.documentTitle', { + version: release.frontmatter.version, + title: release.frontmatter.title, + }) } - }, [release]) + }, [release, t]) if (!release) { throw redirect({ to: '/releases' }) @@ -246,7 +251,7 @@ function ReleaseDetailPage() { {/* Back Link */} - Alle Releases + {t('pages.releaseDetail.backLabel')} {/* Header */} @@ -268,7 +273,7 @@ function ReleaseDetailPage() { {/* Section Label */}
    - Release Notes + {t('pages.releaseDetail.label')}
    @@ -287,7 +292,7 @@ function ReleaseDetailPage() { {isLatest && ( - Aktuell + {t('pages.releaseDetail.currentLabel')} )}
    @@ -495,7 +500,7 @@ function ReleaseDetailPage() { {/* Terminal Content */}
    - # Changelog for v{frontmatter.version} + {t('pages.releaseDetail.changelogTitle', { version: frontmatter.version })}
    {frontmatter.changelog.map((entry) => { @@ -569,7 +574,7 @@ function ReleaseDetailPage() { {/* Prev/Next Navigation */}