From 49fc3a6f64a5cb5813ec1462af3986ab83355496 Mon Sep 17 00:00:00 2001 From: UserIsMH Date: Wed, 6 May 2026 23:44:01 +0200 Subject: [PATCH] i18n: app.js erkennt Sprache und laedt EN-Datenfiles Die Index-Hauptseite hat noch eine Reihe dynamisch gefuellter Texte (Live-Stats-Bar-Titel, Map-Legende, Default-Kategorie-Labels) und laedt summary.json fuer die Excerpts. Auf der EN-Variante hat das bisher zu sichtbarem deutschen Text gefuehrt. - SITE_LANG wird einmal aus abgeleitet - lageTitles existiert pro Sprache - defaultLabels (primary/secondary/tertiary/mentioned) pro Sprache - Legende -> Legend in der Map-Legende - summary.json -> summary_en.json bei EN, mit Fallback auf summary.json wenn EN-Variante nicht existiert (Monitor erzeugt beide bereits) Co-Authored-By: Claude Opus 4.7 (1M context) --- js/app.js | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/js/app.js b/js/app.js index 8303021..cff2409 100644 --- a/js/app.js +++ b/js/app.js @@ -2,6 +2,10 @@ (function () { 'use strict'; + /* ==================== LANGUAGE ==================== */ + var SITE_LANG = (document.documentElement.lang || 'de').toLowerCase().indexOf('en') === 0 ? 'en' : 'de'; + var SUMMARY_FILE = SITE_LANG === 'en' ? 'summary_en.json' : 'summary.json'; + /* ==================== NAVBAR ==================== */ var navbar = document.getElementById('navbar'); window.addEventListener('scroll', function () { @@ -197,11 +201,19 @@ var lageData = {}; var dataLoaded = false; - var lageTitles = { - 'iran-konflikt': 'Gro\u00dflage - Irankonflikt', - 'cyberangriffe': 'Cyberangriffe auf deutsche Infrastruktur', - 'deepfakes': 'Rechtliche Lage von Deepfakes in Deutschland' + var lageTitlesByLang = { + de: { + 'iran-konflikt': 'Gro\u00dflage - Irankonflikt', + 'cyberangriffe': 'Cyberangriffe auf deutsche Infrastruktur', + 'deepfakes': 'Rechtliche Lage von Deepfakes in Deutschland' + }, + en: { + 'iran-konflikt': 'Major situation - Iran conflict', + 'cyberangriffe': 'Cyberattacks on German infrastructure', + 'deepfakes': 'Legal status of deepfakes in Germany' + } }; + var lageTitles = lageTitlesByLang[SITE_LANG] || lageTitlesByLang.de; /* ==================== 3D CAROUSEL ==================== */ var cards = document.querySelectorAll('.carousel-card'); @@ -427,7 +439,8 @@ function mdToHtml(md) { } function loadLiveData() { - fetch('/lagen/iran-konflikt/data/summary.json?t=' + Date.now()) + fetch('/lagen/iran-konflikt/data/' + SUMMARY_FILE + '?t=' + Date.now()) + .then(function (r) { if (!r.ok && SITE_LANG === 'en') return fetch('/lagen/iran-konflikt/data/summary.json?t=' + Date.now()); return r; }) .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) .then(function (data) { var inc = data.incident || {}; @@ -532,7 +545,12 @@ function mdToHtml(md) { mentioned: '#7b7b7b' }; - var defaultLabels = { + var defaultLabels = SITE_LANG === 'en' ? { + primary: 'Primary', + secondary: 'Reactions', + tertiary: 'Involved', + mentioned: 'Mentioned' + } : { primary: 'Hauptgeschehen', secondary: 'Reaktionen', tertiary: 'Beteiligte', @@ -582,7 +600,7 @@ function mdToHtml(md) { legend.onAdd = function () { var div = L.DomUtil.create('div'); div.style.cssText = 'background:#151D2E;padding:10px 14px;border-radius:4px;border:1px solid #1E2D45;box-shadow:0 2px 8px rgba(0,0,0,0.3);font-size:0.8rem;line-height:1.8;color:#E8ECF4;'; - var html = 'Legende
'; + var html = '' + (SITE_LANG === 'en' ? 'Legend' : 'Legende') + '
'; ['primary', 'secondary', 'tertiary', 'mentioned'].forEach(function (cat) { if (usedCategories[cat]) { html += ' ' + categoryLabels[cat] + '
'; @@ -669,7 +687,8 @@ function mdToHtml(md) { /* ==================== LOAD DEEPFAKES DATA ==================== */ function loadDeepfakesData() { - fetch('/lagen/deepfakes/data/summary.json?t=' + Date.now()) + fetch('/lagen/deepfakes/data/' + SUMMARY_FILE + '?t=' + Date.now()) + .then(function (r) { if (!r.ok && SITE_LANG === 'en') return fetch('/lagen/deepfakes/data/summary.json?t=' + Date.now()); return r; }) .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) .then(function (data) { var excerptEl = document.getElementById('excerpt-text-deepfakes'); @@ -696,7 +715,8 @@ function mdToHtml(md) { /* ==================== LOAD CYBERANGRIFFE DATA ==================== */ function loadCyberangriffeData() { - fetch('/lagen/cyberangriffe/data/summary.json?t=' + Date.now()) + fetch('/lagen/cyberangriffe/data/' + SUMMARY_FILE + '?t=' + Date.now()) + .then(function (r) { if (!r.ok && SITE_LANG === 'en') return fetch('/lagen/cyberangriffe/data/summary.json?t=' + Date.now()); return r; }) .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) .then(function (data) { var excerptEl = document.getElementById('excerpt-text-cyberangriffe');