{
  "APP": {
    "TITLE": "Playground",
    "COPYRIGHT": "Bilder und Sourcecode sind urheberrechtlich geschützt, keine Nutzung ohne Zustimmung!"
  },
  "TOPBAR": {
    "ABOUT": "Über mich",
    "IMPRINT": "Impressum",
    "PROJECTS": "Projekte",
    "ALGORITHMS": "Algorithmen",
    "SETTINGS": "Einstellungen",
    "LANGUAGE": "Sprache",
    "APPEARANCE": "Darstellung"
  },
  "THEME": { "LIGHT": "Hell", "DARK": "Dunkel" },
  "LANG": { "LABEL": "Sprache", "EN": "Englisch", "DE": "Deutsch" },
  "ABOUT": {
    "ALT": { "PROFILE": "Profilfoto von Andreas Dahm" },
    "HELLO": "Hallo, ich bin Andreas.",
    "LEAD": "Bereits in meiner Ausbildung zum Fachinformatiker habe ich gemerkt, wie sehr mich Softwareentwicklung interessiert. Nach meinem Studium der Angewandten Informatik an der FH Bingen arbeite ich seit 2010 durchgehend als Softwareentwickler. In dieser Zeit konnte ich in verschiedenen Bereichen Erfahrungen sammeln, darunter 3D-Simulation und moderne Web-Anwendungen. Auch privat beschäftige ich mich gern mit Softwareentwicklung, besonders mit Spieleentwicklung und algorithmischen Themen. Schön, dass du hier bist!",
    "ROLE": "Senior Software Entwickler / Full-Stack Entwickler / Softwarearchitekt",
    "LOCATION": "München · Remote",
    "DOWNLOAD_CV": "Lebenslauf herunterladen",
    "VIEW_PROJECTS": "Projekte ansehen",
    "CONTACT_ME": "Kontaktiere mich",
    "SECTION": {
      "SKILLS": "Fähigkeiten & Stack",
      "BACKEND_ARCH": "Backend & Architektur",
      "INFRA_CLOUD": "Infrastruktur & Cloud",
      "SIM_ALGO": "Simulation & Algorithmen",
      "EXPERIENCE": "Erfahrung",
      "PROJECTS": "Projekte",
      "EDUCATION": "Ausbildung"
    },
    "SKILLS": {
      "JAVA": "Java 8/21+",
      "SPRING": "Spring Boot 2/3",
      "ANGULAR": "Angular 19+",
      "DOCKER": "Docker",
      "UNITY": "Unity",
      "PYTHON": "Python",
      "CSHARP": "C#",
      "TYPESCRIPT": "TypeScript",
      "ARCH_MICROSERVICES": "Microservices",
      "ARCH_CLOUD": "Cloud Architecture",
      "ENG_ALGO": "Algorithm Design",
      "ENG_SIM": "3D Simulation",
      "ENG_GPU": "WebGPU / OpenGL / GLSL",
      "ENG_PERF": "Performance Optimization",
      "ENG_3D": "3D-Scanner Tech"
    },
    "TOOLS": {
      "GIT": "Git",
      "GITHUB": "Github",
      "GITLAB": "Gitlab",
      "JENKINS": "Jenkins",
      "K8S": "Kubernetes / k3d",
      "POSTGRES": "PostgreSQL",
      "MONGO": "MongoDB",
      "GRAFANA": "Grafana/Prometheus",
      "DOCKER": "Docker"
    },
    "XP": {
      "COMPANY9": {
        "COMPANY": "ColorDigital GmbH",
        "ROLE": "Senior Software Engineer",
        "TIME": "März 2026 – heute"
      },
      "COMPANY8": {
        "COMPANY": "Teraport GmbH",
        "ROLE": "Senior Software Developer / Architect",
        "TIME": "Feb. 2024 – Feb. 2026",
        "HIGHLIGHTS": {
          "P1": "Architektur und Implementierung der Datenbankanbindung mit Hibernate 6.x.",
          "P2": "Konzeption und Entwicklung einer Full-Stack-Webanwendung für Kollisionsanalysen (Angular + Spring Boot + Docker).",
          "P3": "Entwicklung eines Kostenanalysetools mit dem Namen MIDO."
        }
      },
      "COMPANY7": {
        "COMPANY": "ColorDigital GmbH",
        "ROLE": "Lead Software Developer",
        "TIME": "März 2023 – Dez. 2023",
        "HIGHLIGHTS": {
          "P1": "Planung einer neuen Cloud-Architektur zur Migration eines umfangreichen Legacy-Monolithen in eine moderne Microservice-Plattform.",
          "P2": "Leitung eines Teams von drei bis vier Backend-Entwickler:innen.",
          "P3": "Zusammenarbeit mit Partnern und Kund:innen bei der Integration ihrer Systeme in die DMIx-Cloud."
        }
      },
      "COMPANY6": {
        "COMPANY": "ColorDigital GmbH",
        "ROLE": "Senior Software Developer",
        "TIME": "März 2021 – März 2023",
        "HIGHLIGHTS": {
          "P1": "Arbeit an der DMIx-Core-Cloud, darunter die Implementierung einer Elasticsearch-basierten Echtzeit-Suchfunktion.",
          "P2": "Implementierung des neuen Browser-Tools „Moodboard“ (Node.js + Vue.js).",
          "P3": "Entwicklung von „PAX“, einem Tool für den Datenaustausch zwischen der DMIx-Cloud und PLM/ERP-Systemen, inkl. CI/CD-Integration."
        }
      },
      "COMPANY5": {
        "COMPANY": "Assyst GmbH",
        "ROLE": "Teamleitung",
        "TIME": "Sep. 2015 – Feb. 2021",
        "HIGHLIGHTS": {
          "P1": "Teamleitung der Vidya-Softwareabteilung, inkl. Personalverantwortung und Bewerbungsprozesse.",
          "P2": "Leitung mehrerer Projekte mit externen Partnern und Freelancer:innen.",
          "P3": "Steuerung strategischer Initiativen im Bereich 3D-Softwareentwicklung."
        }
      },
      "COMPANY4": {
        "COMPANY": "Assyst GmbH",
        "ROLE": "Software Engineer",
        "TIME": "Apr. 2010 – Feb. 2021",
        "HIGHLIGHTS": {
          "P1": "Arbeit an Kerntechnologien wie Algorithmen, Simulation, Rendering und Kollisions­erkennung.",
          "P2": "Einsatz verschiedener Technologien, u. a. Java, OpenCL, OpenGL, GLSL-Shader, C++ und REST-Schnittstellen.",
          "P3": "Mitarbeit an nationalen und internationalen Forschungsprojekten (EU7 und ZIM)."
        }
      },
      "COMPANY3": {
        "COMPANY": "Assyst GmbH",
        "ROLE": "Praktikum und Diplomarbeit",
        "TIME": "Apr. 2009 – Apr. 2010",
        "HIGHLIGHTS": {
          "P1": "Implementierung produktiver Funktionen in der Echtzeit-Kleidersimulationssoftware Vidya.",
          "P2": "Durchführung von Recherchen und Literaturstudien für die Diplomarbeit.",
          "P3": "Erfolgreiche Umsetzung des Diplomthemas in Vidya."
        }
      },
      "COMPANY2": {
        "COMPANY": "TH Bingen (University of Applied Sciences)",
        "ROLE": "Tutor für Grundlagen der Java-Programmierung",
        "TIME": "Apr. 2008 – Aug. 2008",
        "HIGHLIGHTS": {
          "P1": "Erstellung praktischer und theoretischer Lehrmaterialien.",
          "P2": "Durchführung einer 20-stündigen Vorlesungsreihe für den Bioinformatik-Studiengang.",
          "P3": "Unterstützung bei praktischen Programmierübungen."
        }
      },
      "COMPANY1": {
        "COMPANY": "TH Bingen (University of Applied Sciences)",
        "ROLE": "Wissenschaftliche Hilfskraft",
        "TIME": "Okt. 2007 – Apr. 2008",
        "HIGHLIGHTS": {
          "P1": "Evaluation verschiedener Web-2.0-Technologien.",
          "P2": "Implementierung einer Java-basierten Schnittstelle zu Microsoft Excel.",
          "P3": "Integration des MIT-Exhibit-Frameworks und Vorbereitung für die CeBIT 2008."
        }
      },
      "COMPANY0": {
        "COMPANY": "Chamaeleon AG",
        "ROLE": "Ausbildung Fachinformatiker Anwendungsentwicklung",
        "TIME": "Jul. 2002 – Jun. 2005",
        "HIGHLIGHTS": {
          "P1": "Entwicklung in PERL, PHP und ASP.",
          "P2": "Portierung, Wartung und Reengineering von bestender Software.",
          "P3": "Regelmäßige Durchführung von Systemtests und Qualitätskontrollen, sowie deren Dokumentation."
        }
      }
    },
    "PROJECT": {
      "P2": {
        "TITLE": "Playground",
        "DESCRIPTION": "Dieses Projekt ist, wie der Name schon sagt, ein persönlicher Playground, der im Laufe der Zeit wachsen soll. Es präsentiert verschiedene private Projekte, an denen ich arbeite, und dokumentiert deren Fortschritt, zentrale Ideen und wichtige Meilensteine.",
        "LINK_EXTERNAL": "andreas-dahm.eu",
        "LINK_INTERNAL": "Projektdetails",
        "HIGHLIGHTS": {
          "P1": "Einsatz moderner Technologien und CI/CD-Pipelines (Angular 20+, Spring Boot 4, GitHub).",
          "P2": "Präsentation persönlicher Projekte und kontinuierliche Verbesserung algorithmischer Fähigkeiten.",
          "P3": "Vertiefung von JavaScript/TypeScript-, Angular- und Spring-Boot-Kenntnissen durch praktisches Arbeiten."
        }
      },
      "P1": {
        "TITLE": "El Mucho",
        "DESCRIPTION": "Dies ist mein erstes veröffentlichtes Spiel auf Steam. Ich habe es gemeinsam mit meinem Bruder entwickelt und damit eines meiner persönlichen Ziele erreicht: ein eigenes Videospiel zu erstellen und zu veröffentlichen.",
        "LINK_EXTERNAL": "Steam Store",
        "LINK_INTERNAL": "Projektdetails",
        "HIGHLIGHTS": {
          "P1": "Veröffentlichung eines Spiels auf Steam und Integration der Steam-API.",
          "P2": "Konzeption, Planung und vollständige Entwicklung eines eigenen Spiels.",
          "P3": "Implementierung komplexer Algorithmen wie einer eigenen A*-Pfadfindungslogik und Spiel-KI."
        }
      },
      "P0": {
        "TITLE": "Game Jams",
        "DESCRIPTION": "Dieser Bereich zeigt einige meiner bisherigen Game-Jam-Beiträge. Game Jams sind eine großartige Möglichkeit, neue Spielideen auszuprobieren und schnell zu überprüfen, ob ein Game-Loop funktioniert. Die engen Zeitvorgaben fördern den Fokus, es ist faszinierend, was man in so kurzer Zeit alles schaffen kann.",
        "LINK_EXTERNAL": "Itch.io Sammlung",
        "LINK_INTERNAL": "Projektdetails",
        "HIGHLIGHTS": {
          "P1": "Planung eines realistischen Projektumfangs mit einem Team, der innerhalb von 48 Stunden umsetzbar ist.",
          "P2": "Lernen, fokussiert und effizient unter strengen Zeitvorgaben zu arbeiten.",
          "P3": "Die Freude zu erleben, in kurzer Zeit ein spielbares Projekt zu erstellen und andere damit spielen zu sehen."
        }
      },
      "DIPLOMA": {
        "TITLE": "Diplomarbeit - Kollisionserkennung und Behandlung von komplexen Kleidungsstücken.",
        "DESCRIPTION": "Die Diplomarbeit handelt von der Erkennung und der Behandlung von Kollisionen zwischen, sowie innerhalb, einzelnen Kleidungsstücken in Echtzeit. Das ist gerade aufgrund der Flexibilität von Stoffen und deren unterschiedlichen Eigenschaften besonders herausfordernd.",
        "LINK_INTERNAL": "Projektdetails",
        "HIGHLIGHTS": {
          "P1": "Echtzeit behandlung von Kollisionserkennung und Behandlung.",
          "P2": "Verstehen und Einschätzen von wissenschaftlichen Arbeiten.",
          "P3": "Adaption und Weiterentwicklung von vorausgegangenen Forschungsarbeiten."
        }
      },
      "TRIBBLE": {
        "TITLE": "Homeserver 'Tribble'",
        "DESCRIPTION": "In diesem Projekt geht es um die Einrichtung und Wartung meines eigenen Homeservers. Er betreibt mehrere Docker-Container wie Gitea, Jellyfin und mehr. Es ist eine großartige Lernerfahrung im Bereich Self-Hosting und Systemadministration.",
        "LINK_INTERNAL": "Projektdetails",
        "HIGHLIGHTS": {
          "P1": "Self-Hosting verschiedener Dienste mit Docker.",
          "P2": "CI/CD-Pipeline für die persönliche Website mit Gitea.",
          "P3": "Sicherer Fernzugriff mit Tailscale und Traefik."
        }
      }
    },
    "EDUCATION": {
      "E6": {
        "WHERE": "FH Bingen (University of Applied Sciences)",
        "WHEN": "2006 - 2010",
        "WHAT": "Diplom (FH), Angewandte Informatik (Schnitt 1.4)"
      },
      "E5": {
        "WHERE": "FH Koblenz (University of Applied Sciences)",
        "WHEN": "2005 - 2006",
        "WHAT": "1 Semester Ingenieurinformatik"
      },
      "E4": {
        "WHERE": "BBS Montabaur",
        "WHEN": "2002 - 2005",
        "WHAT": "Ausbildung zum Fachinformatiker Anwendungsentwicklung"
      },
      "E3": {
        "WHERE": "BBS Andernach - Höhere Berufsbachschule (Informatik)",
        "WHEN": "2000 - 2002",
        "WHAT": "Fachhochschulreife"
      },
      "E2": {
        "WHERE": "BBS Andernach - Berufsfachschule Technik (E-Technik)",
        "WHEN": "1998 - 2000",
        "WHAT": "Realschulabschluss"
      },
      "E1": {
        "WHERE": "Hauptschule Hinter Burg Mayen (Albert Schweitzer Realschule plus)",
        "WHEN": "1995 - 1998 ",
        "WHAT": "Hauptschulabschluss"
      },
      "E0": {
        "WHERE": "Albert Schweitzer Realschule Mayen",
        "WHEN": "1993 - 1995",
        "WHAT": "Kein Abschluss. Wechsel zur Hauptschule"
      }
    }
  },
  "PROJECTS": {
    "DOWNLOAD": "Herunterladen",
    "READ_MORE": "Mehr erfahren",
    "LINK_TO_PROJECT": "Zum Projekt",
    "CLOSE": "Schließen",
    "SECTION": {
      "TECHNICAL": "Technische Herausforderungen",
      "LEARNINGS": "Learnings & Soft Skills"
    },
    "PLAYGROUND": {
      "TITLE": "Playground Portfolio",
      "SHORT_DESCRIPTION": "Full-Stack Portfolio mit interaktiven Algorithmus-Visualisierungen.",
      "INTRODUCTION": "Diese Website dient als lebendiges Portfolio und Testumgebung für moderne Webtechnologien. Ziel ist es, komplexe Algorithmen und mathematische Konzepte (wie WebGPU-Simulationen oder Raymarching) anschaulich im Browser darzustellen.",
      "BULLET_1": "Entwicklung mit Angular 19+ und Material Design.",
      "BULLET_2": "Implementierung performanter Visualisierungen (WebGPU, Shader, Canvas).",
      "BULLET_3": "Automatisierte CI/CD-Pipelines und Containerisierung mit Docker.",
      "BULLET_4": "Internationalisierung (i18n) für globale Reichweite.",
      "CHALLENGE_1": "Optimierung der Render-Performance bei komplexen 3D-Fraktalen in Echtzeit.",
      "CHALLENGE_2": "Architektur einer skalierbaren und wartbaren Frontend-Struktur für diverse Sub-Projekte.",
      "LEARNING_1": "Effektives UI/UX-Design für komplexe datengesteuerte Visualisierungen.",
      "LEARNING_2": "Modernstes State-Management und reaktive Programmierung in Angular."
    },
    "TRIBBLE": {
      "TITLE": "Self-Hosted Infrastructure",
      "SHORT_DESCRIPTION": "Home-Infrastruktur mit Docker, Traefik und sicherer VPN-Anbindung.",
      "INTRODUCTION": "Dokumentation und Aufbau einer privaten Cloud-Infrastruktur. Fokus liegt auf Datensouveränität, Automatisierung und Sicherheit.",
      "BULLET_1": "Zentrale Verwaltung via Docker-Compose und Portainer.",
      "BULLET_2": "Automatisches SSL-Management und Reverse-Proxy mit Traefik.",
      "BULLET_3": "Private Versionskontrolle (Gitea) und Medien-Streaming (Jellyfin).",
      "BULLET_4": "Netzwerkweite Ad-Blocking und DNS-Kontrolle via AdGuard Home.",
      "CHALLENGE_1": "Konfiguration sicherer Netzwerkschichten und Firewall-Regeln für Remote-Zugriff.",
      "CHALLENGE_2": "Automatisierung von Backups und Recovery-Strategien für containerisierte Daten.",
      "LEARNING_1": "Tiefes Verständnis für moderne Netzwerkprotokolle und IT-Sicherheit.",
      "LEARNING_2": "Effizientes Ressourcen-Management auf limitierten Server-Systemen."
    },
    "EL_MUCHO": {
      "TITLE": "El Mucho (Steam Release)",
      "SHORT_DESCRIPTION": "Rundenbasiertes Taktik-RPG, veröffentlicht auf Steam.",
      "INTRODUCTION": "Ein kommerzielles Spieleprojekt, das von der ersten Idee bis zum weltweiten Release auf Steam eigenverantwortlich umgesetzt wurde. Ein taktisches RPG, das klassische Gameplay-Elemente mit modernen Systemen verbindet.",
      "BULLET_1": "Komplette Engine-Entwicklung in Unity (C#).",
      "BULLET_2": "Integration von Steamworks-Funktionen (Achievements, Cloud Saves).",
      "BULLET_3": "Entwicklung einer eigenen taktischen KI und Pfadfindungs-Logik.",
      "BULLET_4": "Management des gesamten Asset-Pipelines und Sound-Designs.",
      "CHALLENGE_1": "Implementierung eines robusten rundenbasierten Systems mit komplexen Abhängigkeiten.",
      "CHALLENGE_2": "Performance-Optimierung für eine flüssige Darstellung auf verschiedenen Hardware-Profilen.",
      "CHALLENGE_3": "Umgang mit den strengen Zertifizierungs-Anforderungen von Steam.",
      "LEARNING_1": "Durchhaltevermögen und Fokus über einen mehrjährigen Entwicklungszyklus.",
      "LEARNING_2": "Vermarktung und Community-Management für ein digitales Produkt."
    },
    "GAME_JAMS": {
      "TITLE": "Rapid Prototyping & Game Jams",
      "SHORT_DESCRIPTION": "Sammlung innovativer Spielkonzepte, entstanden in unter 48 Stunden.",
      "INTRODUCTION": "Teilnahme an nationalen Wettbewerben (z.B. Beansjam). Hier geht es darum, unter extremem Zeitdruck funktionale und spaßige Prototypen zu erschaffen.",
      "BULLET_1": "Fokus auf 'Core Game Loop' und schnelles Feedback.",
      "BULLET_2": "Kollaborative Entwicklung in kleinen, agilen Teams.",
      "BULLET_3": "Effektives Zeitmanagement und Scope-Kontrolle.",
      "BULLET_4": "Veröffentlichung und Iteration basierend auf Community-Votings.",
      "CHALLENGE_1": "Reduzierung komplexer Ideen auf ein in 48h umsetzbares Minimum Viable Product (MVP).",
      "CHALLENGE_2": "Schnelle Fehlerdiagnose und Bugfixing unter massivem Zeitdruck.",
      "LEARNING_1": "Radikale Priorisierung von Features ('Kill your darlings').",
      "LEARNING_2": "Effektive Kommunikation und Entscheidungsfindung im Team-Stress."
    },
    "DIPLOMA": {
      "TITLE": "Wissenschaftliche Diplomarbeit",
      "SHORT_DESCRIPTION": "Echtzeit-Kollisionserkennung für komplexe, flexible 3D-Objekte.",
      "INTRODUCTION": "Forschungsarbeit im Bereich Computergraphik. Entwicklung eines Algorithmus zur physikalisch korrekten Simulation von Stoffen und Kleidung in Echtzeit.",
      "BULLET_1": "Mathematische Modellierung von Mass-Spring-Systemen.",
      "BULLET_2": "Low-Level Programmierung mit Java.",
      "BULLET_3": "Optimierung durch räumliche Datenstrukturen (AABB Trees, Bounding Spheres).",
      "BULLET_4": "Wissenschaftliche Evaluation der Simulations-Präzision.",
      "CHALLENGE_1": "Behandlung von 'Self-Collisions' bei hochauflösenden Meshes ohne Performance-Einbruch.",
      "CHALLENGE_2": "Mathematische Stabilisierung der Integrationsverfahren bei hohen Krafteinwirkungen.",
      "LEARNING_1": "Transfer von theoretischen Forschungsarbeiten in produktiven, performanten Code.",
      "LEARNING_2": "Präzises Arbeiten und Dokumentation nach wissenschaftlichen Standards."
    }
  },
  "IMPRINT": {
    "TITLE" : "Impressum",
    "PARAGRAPH": "Angaben gemäß § 5 DDG",
    "COUNTRY": "Deutschland",
    "CONTACT": "Kontakt"
  },
  "PATHFINDING": {
    "TITLE": "Pfadfindungsalgorithmen",
    "START_NODE": "Startknoten",
    "END_NODE": "Endknoten",
    "WALL": "Wand",
    "CLEAR_NODE": "Löschen",
    "DIJKSTRA": "Start Dijkstra",
    "ASTAR": "Start A*",
    "NORMAL_CASE": "Testaufbau",
    "EDGE_CASE": "A* Grenzfall-Aufbau",
    "RANDOM_CASE": "Zufälliger-Aufbau",
    "CLEAR_BOARD": "Leeres Gitter",
    "VISITED": "Besucht",
    "PATH": "Pfad",
    "PATH_LENGTH": "Pfadlänge",
    "EXECUTION_TIME": "Ausführungszeit",
    "EXPLANATION": {
      "TITLE": "Algorithmen",
      "DIJKSTRA_EXPLANATION": " findet garantiert den kürzesten Weg, wenn alle Kantenkosten nicht-negativ sind. Vorteil: optimal und ohne Heuristik. Nachteil: besucht oft sehr viele Knoten (kann bei großen Grids langsamer wirken).",
      "ASTAR_EXPLANATION": " erweitert Dijkstra um eine Heuristik (z.B. Manhattan-Distanz) und kann dadurch wesentlich zielgerichteter suchen. Vorteil: oft deutlich schneller bei guter Heuristik; bei zulässiger Heuristik bleibt der Weg optimal. Nachteil: hängt stark von der Heuristik ab (schlechte Heuristik ≈ Dijkstra).",
      "DISCLAIMER": "Diese A*-Implementierung ist bewusst einfach gehalten. Es wird nur in vier Richtungen gegangen und jeder Schritt kostet 1. Die Heuristik ist minimal und dient nur dazu, das Prinzip von A* gegenüber Dijkstra zu demonstrieren. Ziel ist nicht ein optimaler oder produktionsreifer A*-Algorithmus, sondern eine anschauliche Visualisierung, wie Heuristiken die Suche beschleunigen können."
    },
    "ALERT": {
      "START_END_NODES": "Bitte wählen Sie einen Start- und Endknoten aus, bevor Sie den Algorithmus starten."
    }
  },
  "SORTING": {
    "TITLE": "Sortieralgorithmen",
    "ALGORITHM": "Algorithmen",
    "START": "Sortierung starten",
    "RESET": "Zurücksetzen",
    "GENERATE_NEW_ARRAY": "Neues Array generieren",
    "EXECUTION_TIME": "Ausführungszeit",
    "ARRAY_SIZE": "Anzahl der Balken",
    "EXPLANATION": {
      "TITLE": "Algorithmen",
      "BUBBLE_SORT_EXPLANATION":"vergleicht wiederholt benachbarte Elemente und tauscht sie, wenn sie in der falschen Reihenfolge stehen. Das größte Element \"blubbert\" dabei wie eine Luftblase ans Ende der Liste. Vorteil: Extrem einfach zu verstehen und zu implementieren; erkennt bereits sortierte Listen sehr schnell. Nachteil: Sehr ineffizient bei großen Listen (Laufzeit O(n²)). In der Praxis kaum genutzt.",
      "QUICK_SORT_EXPLANATION": "folgt dem \"Teile und Herrsche\"-Prinzip. Ein \"Pivot\"-Element wird gewählt, und das Array wird in zwei Hälften geteilt: Elemente kleiner als das Pivot und Elemente größer als das Pivot. Vorteil: Im Durchschnitt einer der schnellsten Sortieralgorithmen (O(n log n)); benötigt keinen zusätzlichen Speicher (In-Place). Nachteil: Im schlechtesten Fall (Worst Case) langsam (O(n²)), wenn das Pivot ungünstig gewählt wird. Ist nicht stabil (ändert Reihenfolge gleicher Elemente).",
      "HEAP_SORT_EXPLANATION": "organisiert die Daten zunächst in einer speziellen Baumstruktur (Binary Heap). Das größte Element (die Wurzel) wird entnommen und ans Ende sortiert, dann wird der Baum repariert. Vorteil: Garantiert eine schnelle Laufzeit von O(n log n), selbst im schlechtesten Fall. Benötigt fast keinen zusätzlichen Speicher. Nachteil: In der Praxis oft etwas langsamer als Quick Sort, da die Sprünge im Speicher (Heap-Struktur) den CPU-Cache schlechter nutzen.",
      "COCKTAIL_SORT_EXPLANATION" : "(auch Shaker Sort) ist eine Erweiterung des Bubble Sort. Statt nur von links nach rechts zu gehen, wechselt er bei jedem Durchlauf die Richtung und schiebt abwechselnd das größte Element nach rechts und das kleinste nach links. Vorteil: Schneller als Bubble Sort, da kleine Elemente am Ende schneller nach vorne wandern (\"Schildkröten-Problem\" gelöst). Nachteil: Bleibt in der Laufzeitklasse O(n²), also für große Datenmengen ineffizient.",
      "DISCLAIMER": "Die Wahl des \"besten\" Sortieralgorithmus hängt stark von den Daten und den Rahmenbedingungen ab. In der Informatik betrachtet man oft drei Szenarien:",
      "DISCLAIMER_1": "Best Case: Die Daten sind schon fast sortiert (hier glänzt z.B. Bubble Sort).",
      "DISCLAIMER_2": "Average Case: Der statistische Normalfall.",
      "DISCLAIMER_3": "Worst Case: Die Daten sind maximal ungünstig angeordnet (hier bricht Quick Sort ohne Optimierung ein, während Heap Sort stabil bleibt).",
      "DISCLAIMER_4": "Zusätzlich gibt es fast immer einen Time-Space Trade-off (Zeit-Speicher-Kompromiss): Algorithmen, die extrem schnell sind (wie Merge Sort), benötigen oft viel zusätzlichen Arbeitsspeicher. Algorithmen, die direkt im vorhandenen Speicher arbeiten (wie Heap Sort), sparen Platz, sind aber manchmal komplexer oder minimal langsamer. Es gibt also keine \"One-Size-Fits-All\"-Lösung."
    }
  },
  "GOL": {
    "TITLE": "Conway's Spiel des Lebens",
    "START": "Starten",
    "PAUSE": "Pause",
    "RANDOM_SCENE": "Zufällig",
    "EMPTY_SCENE": "Leer",
    "SIMPLE_SCENE": "Gleiter",
    "PULSAR_SCENE": "Pulsar",
    "GUN_SCENE": "Pistole",
    "ALIVE": "Lebend",
    "DEAD": "Leer",
    "SPEED": "Zeit pro Generation",
    "EXPLANATION": {
      "TITLE": "Erklärung",
      "EXPLANATION" : "Das Spiel läuft schrittweise ab. Zunächst wird eine Anfangsgeneration von lebenden Zellen auf dem Spielfeld definiert. Aus der vorliegenden Generation (dem Gesamtbild des Spielfeldes) wird die Folgegeneration ermittelt. Der Zustand jeder einzelnen Zelle in der Folgegeneration ergibt sich dabei nach einfachen Regeln aus ihrem aktuellen Zustand sowie den aktuellen Zuständen ihrer acht Nachbarzellen (Moore-Nachbarschaft).",
      "DISCLAIMER": "Nach Conways ursprünglicher Regel lebt eine Zelle in der nächsten Runde, wenn zuvor in ihrer 3x3-Umgebung insgesamt genau drei Zellen leben, wobei sie selbst nur bei Bedarf mitgezählt wird, das heißt:",
      "DISCLAIMER_1": "Eine lebende Zelle lebt auch in der Folgegeneration, wenn sie entweder zwei oder drei lebende Nachbarn hat.",
      "DISCLAIMER_2": "Eine tote Zelle „wird geboren“ (lebt in der Folgegeneration), wenn sie genau drei lebende Nachbarn hat.",
      "DISCLAIMER_3": "Eine lebende Zelle „stirbt“ (ist in der Folgegeneration tot), wenn sie weniger als zwei (Vereinsamung) oder mehr als drei (Übervölkerung) lebende Nachbarn hat.",
      "DISCLAIMER_4": " Eine tote Zelle bleibt tot, wenn sie nicht genau drei lebende Nachbarn hat."
    }
  },
  "LABYRINTH": {
    "TITLE": "Labyrinth-Erzeugung",
    "PRIM": "Erzeuge Prim's Labyrinth",
    "KRUSKAL": "Erzeuge Kruskal's Labyrinth",
    "EXPLANATION": {
      "TITLE": "Algorithmen",
      "PRIM_EXPLANATION": "startet an einem zufälligen Punkt und erweitert das Labyrinth, indem er immer eine zufällige benachbarte Wand zu einer bereits besuchten Zelle auswählt und diese öffnet. Vorteil: Erzeugt sehr gleichmäßige, natürlich wirkende Labyrinthe mit vielen kurzen Sackgassen. Visuell wirkt es wie ein organisches Wachstum von einem Zentrum aus.",
      "KRUSKAL_EXPLANATION": "betrachtet alle Wände des Gitters als potenzielle Wege. Er wählt zufällig Wände aus und öffnet sie nur dann, wenn die beiden angrenzenden Zellen noch nicht miteinander verbunden sind (verhindert Kreise). Vorteil: Erzeugt ein sehr komplexes Labyrinth mit vielen langen, verwinkelten Pfaden. Visuell ist es spannend, da das Labyrinth an vielen Stellen gleichzeitig entsteht und am Ende zu einem Ganzen verschmilzt.",
      "DISCLAIMER": "Beide Algorithmen basieren auf dem Prinzip des 'Minimal Spanning Tree' (Minimaler Spannbaum). Das bedeutet für dein Labyrinth:",
      "DISCLAIMER_1": "Perfektes Labyrinth: Es gibt keine geschlossenen Kreise (Loops) – jeder Punkt ist erreichbar, aber es gibt immer nur genau einen Weg zwischen zwei Punkten.",
      "DISCLAIMER_2": "Erreichbarkeit: Da es ein Spannbaum ist, wird garantiert jede Zelle des Gitters Teil des Labyrinths, es gibt keine isolierten Bereiche.",
      "DISCLAIMER_3": "Zufälligkeit: Durch die Gewichtung der Kanten mit Zufallswerten entstehen bei jedem Durchlauf völlig neue, einzigartige Strukturen.",
      "DISCLAIMER_4": "Anwendung: Solche Labyrinthe sind die perfekte Testumgebung für Pfadfindungsalgorithmen wie Dijkstra oder A*."
    }
  },
  "FRACTAL": {
    "TITLE": "Fraktale",
    "ALGORITHM": "Algorithmen",
    "RESET": "Reset",
    "COLOR_SCHEME": "Farbschema",
    "MAX_ITERATION": "Maximale Auflösung",
    "EXPLANATION": {
      "TITLE": "Mathematische Kunst",
      "MANDELBROT_EXPLANATION": "basiert auf der iterativen Formel 'z_{n+1} = z_n^2 + c'. Sie prüft für jeden Punkt in der komplexen Ebene, ob die Zahlenfolge stabil bleibt oder ins Unendliche entkommt. Vorteil: Gilt als 'Apfelmännchen' und Mutter der Fraktale. Sie bietet eine unendliche Vielfalt an selbstähnlichen Strukturen, in die man ewig hineinzoomen kann.",
      "JULIA_EXPLANATION": "nutzt dieselbe Formel wie Mandelbrot, fixiert jedoch den Parameter 'c' und variiert den Startwert. Je nach Wahl von 'c' entstehen filigrane, wolkenartige Gebilde oder zusammenhanglose 'Staubwolken'. Vorteil: Ermöglicht eine enorme ästiehetische Varianz, da jede Koordinate der Mandelbrot-Menge ein völlig eigenes, einzigartiges Julia-Fraktal erzeugt.",
      "NEWTON_EXPLANATION": "entsteht durch die Visualisierung des Newton-Verfahrens zur Nullstellen-Suche einer komplexen Funktion. Jeder Pixel wird danach eingefärbt, zu welcher Nullstelle der Algorithmus konvergiert. Vorteil: Erzeugt faszinierende, sternförmige Symmetrien und komplexe Grenzen, an denen sich die Einzugsgebiete der Nullstellen auf chaotische Weise treffen.",
      "BURNING_SHIP_EXPLANATION": "ist eine Variation des Mandelbrots, bei der vor jedem Iterationsschritt der Absolutbetrag der Real- und Imaginärteile genommen wird: '(|Re(z)| + i|Im(z)|)^2 + c'. Vorteil: Erzeugt eine markante, asymmetrische Struktur, die einem brennenden Schiff mit Segeln ähnelt. Das Fraktal wirkt düsterer und 'mechanischer' als die klassischen Mengen.",
      "DISCLAIMER": "Alle diese Fraktale basieren auf dem Prinzip der Iteration und dem Chaos-Effekt. Das bedeutet für deine Visualisierung:",
      "DISCLAIMER_1": "Unendliche Tiefe: Egal wie weit du hineinzoomst, es erscheinen immer neue, komplexe Strukturen, die dem Ganzen oft ähneln (Selbstähnlichkeit).",
      "DISCLAIMER_2": "Fluchtzeit-Algorithmus: Die Farben geben meist an, wie schnell eine Folge einen bestimmten Schwellenwert überschreitet – je schneller, desto 'heißer' oder heller die Farbe.",
      "DISCLAIMER_3": "Komplexe Zahlen: Die Berechnung findet nicht in einem normalen Koordinatensystem statt, sondern in der komplexen Ebene mit realen und imaginären Anteilen.",
      "DISCLAIMER_4": "Rechenintensität: Da für jeden Pixel hunderte Berechnungen durchgeführt werden, sind Fraktale ein klassischer Benchmark für die Performance von Grafikprozessoren (GPUs).",
      "DISCLAIMER_BOTTOM": "Grafikkarten rechnen standardmäßig mit 32-Bit Fließkommazahlen (float). Diese haben nur etwa 7 Stellen Genauigkeit. Bei sehr hohem Zoom (> 100.000) ist der Unterschied zwischen zwei Pixeln so winzig, dass die Grafikkarte ihn nicht mehr darstellen kann. Sie berechnet für 10 Pixel nebeneinander exakt denselben Wert -> Du siehst Blöcke oder Treppenstufen."
    }
  },
  "FRACTAL3D": {
    "TITLE": "3D Fraktale",
    "ALGORITHM": "Algorithmen",
    "MANDELBULB": "Mandelbulb",
    "MANDELBOX": "Mandelbox",
    "JULIA": "Julia",
    "EXPLANATION": {
      "TITLE": "3D Fraktale Welten",
      "MANDELBULB_EXPLANATION": "gilt als der 'Heilige Gral' der 3D-Fraktale. Da komplexe Zahlen nur zweidimensional sind, nutzt dieses Fraktal sphärische Koordinaten und hohe Potenzen (meist v^8 + c), um die Mandelbrot-Menge in den Raum zu projizieren. Vorteil: Es entsteht eine organische, extrem detaillierte Struktur, die an Pflanzen, Korallen oder außerirdische Landschaften erinnert.",
      "MANDELBOX_EXPLANATION": "basiert nicht auf glatten Kurven, sondern auf geometrischem 'Falten' und Skalieren (Box-Folding & Sphere-Folding). Der Raum wird wie Papier immer wieder gefaltet und gespiegelt. Vorteil: Erzeugt streng geometrische, mechanisch wirkende Strukturen, die wie endlose futuristische Städte, der Borg-Würfel oder komplexe Sci-Fi-Architektur aussehen.",
      "JULIA_EXPLANATION": "ist das 3D-Pendant zur 2D-Julia-Menge. Während der Mandelbulb eine 'Karte' aller Fraktale ist, fixiert man hier den Parameter 'c' und variiert den Startpunkt zudem variiert es mit der Zeit. Vorteil: Anders als der massive Mandelbulb sind Julia-Bulbs oft hohle, komplexe Tunnelsysteme oder blasenartige Strukturen, die sich perfekt eignen, um mit der Kamera hindurchzufliegen.",
      "DISCLAIMER": "Diese Visualisierung nutzt eine Technik namens 'Raymarching' (Sphere Tracing). Das bedeutet:",
      "DISCLAIMER_1": "Keine Polygone: Es gibt keine Dreiecke oder Gitter. Die Form wird rein mathematisch für jeden Pixel in Echtzeit berechnet.",
      "DISCLAIMER_2": "Distance Estimation: Der Algorithmus 'tastet' sich mit Lichtstrahlen voran, indem er berechnet, wie weit das nächste Objekt entfernt ist, ohne es sofort zu berühren.",
      "DISCLAIMER_3": "Unendliche Details: Da die Oberfläche mathematisch definiert ist, verpixelt sie nicht beim Zoom – es erscheinen immer neue Strukturen.",
      "DISCLAIMER_4": "Licht & Schatten: Um die Tiefe sichtbar zu machen, werden Lichtreflexionen und Schatten (Ambient Occlusion) basierend auf der Krümmung der Formel simuliert."
    }
  },
  "PENDULUM": {
    "TITLE": "Doppel-Pendel",
    "TRAIL_DECAY_TIME": "Spurlänge",
    "DAMPING": "Dämpfung",
    "ATTRACTION": "Anziehungskraft",
    "L1_LENGTH": "Länge L1",
    "L2_LENGTH": "Länge L2",
    "M1_MASS": "Masse M1",
    "M2_MASS": "Masse M2",
    "POKE_M1": "Schubse M1",
    "POKE_M2": "Schubse M2",
    "RESET": "Neustarten",
    "EXPLANATION": {
      "TITLE": "Chaostheorie: Das Doppelpendel",
      "EXPLANATION": "Das Doppelpendel ist eines der bekanntesten und faszinierendsten Beispiele der Physik für ein dynamisches System, das 'deterministisches Chaos' erzeugt. Es besteht schlicht aus einem einfachen Pendel, an dessen unterem Ende ein zweites Pendel befestigt ist. Obwohl die zugrundeliegenden Bewegungsgesetze der klassischen Mechanik streng mathematisch definiert sind, ist das Verhalten des Doppelpendels auf lange Sicht absolut unvorhersehbar. Es gilt in der Physik als das klassische Vorzeigeobjekt für den sogenannten Schmetterlingseffekt.",
      "DISCLAIMER": "Diese WebGPU-Simulation berechnet die Bewegungs- und Beschleunigungsgleichungen des Pendels 60-mal pro Sekunde in Echtzeit. Dabei gelten folgende Besonderheiten:",
      "DISCLAIMER_1": "Extreme Sensitivität: Winzigste Änderungen in den Startbedingungen (z.B. ein Tausendstel Grad Abweichung im Startwinkel oder bei der Masse) führen schon nach kurzer Zeit zu einer völlig anderen, chaotischen Flugbahn.",
      "DISCLAIMER_2": "Deterministisches Chaos: Die Bewegung wirkt zwar völlig wild und zufällig, ist es aber nicht. Startest du die Simulation mit exakt denselben Werten neu, wird das Pendel zu 100 % denselben Weg fliegen.",
      "DISCLAIMER_3": "Numerische Integration: Da Computer Zeit nicht stufenlos, sondern in winzigen Schritten (dt) berechnen, entstehen bei jedem Frame winzige mathematische Rundungsfehler. Diese summieren sich auf und beeinflussen das Chaos zusätzlich.",
      "DISCLAIMER_4": "Energieerhaltung & Reibung: In einem perfekten physikalischen System ohne Widerstand würde das Pendel ewig weiterschwingen. Für eine natürliche Optik nutzt der Algorithmus einen künstlichen Dämpfungsfaktor, der Luftreibung simuliert und das System irgendwann beruhigt.",
      "DISCLAIMER_BOTTOM": "HINWEIS: Wenn zuviele Impulse in das System gegeben werden, wird die Simulation instabil. Dann hängt das Pendel nur noch runter und es muss neu gestartet werden."
    }
  },
  "CLOTH": {
    "TITLE": "Stoffsimulation",
    "WIND_ON": "Wind Einschalten",
    "WIND_OFF": "Wind Ausschalten",
    "OUTLINE_ON": "Mesh anzeigen",
    "OUTLINE_OFF": "Mesh ausschalten",
    "EXPLANATION": {
      "TITLE": "Echtzeit-Stoffsimulation auf der GPU",
      "CLOTH_SIMULATION_EXPLANATION_TITLE": "Stoffsimulation",
      "XPBD_EXPLANATION_TITLE": "XPBD (Extended Position-Based Dynamics)",
      "GPU_PARALLELIZATION_EXPLANATION_TITLE": "GPU Parallelisierung",
      "DATA_STRUCTURES_EXPLANATION_TITLE": "Datenstrukturen",
      "CLOTH_SIMULATION_EXPLANATION": "Stoffsimulationen modellieren Textilien meist als ein Gitter aus Massepunkten (Vertices), die durch unsichtbare Verbindungen zusammengehalten werden. Ziel ist es, physikalische Einflüsse wie Schwerkraft, Wind und Kollisionen in Echtzeit darzustellen, ohne dass das Material zerreißt oder sich unnatürlich wie Gummi dehnt.",
      "XPBD_EXPLANATION": "XPBD (Extended Position-Based Dynamics) ist ein moderner Algorithmus, der statt Beschleunigungen direkt die Positionen der Punkte manipuliert, um Abstandsbedingungen (Constraints) zu erfüllen. Das 'Extended' bedeutet, dass echte physikalische Steifigkeit unabhängig von der Framerate simuliert wird. Vorteil: Absolut stabil, explodiert nicht und topologische Änderungen (wie das Zerschneiden von Stoff) sind trivial. Nachteil: Es ist ein iteratives Näherungsverfahren und physikalisch minimal weniger akkurat als komplexe Matrix-Löser.",
      "GPU_PARALLELIZATION_EXPLANATION": "Um zehntausende Punkte parallel auf der Grafikkarte zu berechnen, muss man 'Race Conditions' verhindern – also dass zwei Rechenkerne gleichzeitig denselben Knotenpunkt verschieben. Die Lösung nennt sich 'Independent Sets' (oder Graph Coloring): Die Verbindungen werden in isolierte Gruppen (z. B. 4 Phasen bei einem Gitter) unterteilt, in denen sich kein einziger Punkt überschneidet. So kann die GPU jede Gruppe blind und mit maximaler Geschwindigkeit abarbeiten.",
      "DATA_STRUCTURES_EXPLANATION": "Für maximale GPU-Performance müssen Daten speicherfreundlich ausgerichtet werden (16-Byte-Alignment). Anstatt viele einzelne Variablen zu nutzen, packt man Informationen clever in 4er-Blöcke (vec4). Ein Vertex speichert so z. B. [X, Y, Z, Inverse_Masse]. Hat ein Punkt die inverse Masse 0.0, wird er vom Algorithmus ignoriert und schwebt unbeweglich in der Luft – ein eleganter Trick für Aufhängungen ohne extra Wenn-Dann-Abfragen.",
      "DISCLAIMER": "XPBD vs. Masse-Feder-Systeme: In der physikalischen Simulation gibt es grundlegende Architektur-Unterschiede beim Lösen der Gleichungen:",
      "DISCLAIMER_1": "Klassische Masse-Feder-Systeme: Hier werden Kräfte (Hookesches Gesetz) berechnet, die zu Beschleunigungen und schließlich zu neuen Positionen führen. Es gibt zwei Wege, diese mathematisch in die Zukunft zu rechnen (Integration):",
      "DISCLAIMER_2": "Explizite Löser (z.B. Forward Euler): Sie berechnen den nächsten Schritt stur aus dem aktuellen Zustand. Sie sind leicht zu programmieren, aber bei steifen Stoffen extrem instabil. Die Kräfte schaukeln sich auf und die Simulation 'explodiert', sofern man keine winzigen, sehr leistungsfressenden Zeitschritte wählt.",
      "DISCLAIMER_3": "Implizite Löser (z.B. Backward Euler): Sie berechnen den nächsten Schritt basierend auf dem zukünftigen Zustand. Das ist mathematisch enorm stabil, erfordert aber das Lösen riesiger globaler Matrix-Gleichungssysteme in jedem Frame. Dies ist auf der GPU schwerer zu parallelisieren und bricht zusammen, wenn sich die Struktur ändert (z. B. durch Zerschneiden des Stoffs).",
      "DISCLAIMER_4": "Der XPBD-Kompromiss: XPBD umgeht dieses komplexe Matrix-Problem völlig, indem es als lokaler Löser arbeitet. Es kombiniert die unbedingte Stabilität eines impliziten Lösers mit der enormen Geschwindigkeit, Parallelisierbarkeit und dynamischen Anpassungsfähigkeit eines expliziten Systems."
    }
  },
  "ALGORITHM": {
    "TITLE": "Algorithmen",
    "PATHFINDING": {
      "TITLE": "Wegfindung",
      "DESCRIPTION": "Vergleich von Dijkstra vs. A*."
    },
    "SORTING": {
      "TITLE": "Sortierung",
      "DESCRIPTION": "Visualisierung verschiedener Sortieralgorithmen."
    },
    "GOL": {
      "TITLE": "Conway's Game of Life",
      "DESCRIPTION": "Das 'Spiel des Lebens' ist ein vom Mathematiker John Horton Conway 1970 entworfenes Spiel."
    },
    "LABYRINTH": {
      "TITLE": "Labyrinth-Erzeugung",
      "DESCRIPTION": "Visualisierung verschiedener Laybrinth-Erzeugungs-Algorithmen."
    },
    "FRACTAL": {
      "TITLE": "Fraktale",
      "DESCRIPTION": "Visualisierung von komplexe, geometrische Mustern, die sich selbst in immer kleineren Maßstäben ähneln (Selbstähnlichkeit)."
    },
    "FRACTAL3D": {
      "TITLE": "Fraktale 3D",
      "DESCRIPTION": "3D-Visualisierung von komplexe, geometrische Mustern, die sich selbst in immer kleineren Maßstäben ähneln (Selbstähnlichkeit)."
    },
    "PENDULUM": {
      "TITLE": "Doppel-Pendel",
      "DESCRIPTION": "Visualisierung einer chaotischen Doppel-Pendel-Simulation mit WebGPU."
    },
    "CLOTH": {
      "TITLE": "Stoffsimulation",
      "DESCRIPTION": "Simulation on Stoff mit WebGPU."
    },
    "NOTE": "HINWEIS",
    "GRID_HEIGHT": "Höhe",
    "GRID_WIDTH": "Beite"
  }
}
