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 <html lang> 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) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
2026-05-06 23:44:01 +02:00
Ursprung 2840f42059
Commit 49fc3a6f64

Datei anzeigen

@@ -2,6 +2,10 @@
(function () { (function () {
'use strict'; '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 ==================== */ /* ==================== NAVBAR ==================== */
var navbar = document.getElementById('navbar'); var navbar = document.getElementById('navbar');
window.addEventListener('scroll', function () { window.addEventListener('scroll', function () {
@@ -197,11 +201,19 @@
var lageData = {}; var lageData = {};
var dataLoaded = false; var dataLoaded = false;
var lageTitles = { var lageTitlesByLang = {
de: {
'iran-konflikt': 'Gro\u00dflage - Irankonflikt', 'iran-konflikt': 'Gro\u00dflage - Irankonflikt',
'cyberangriffe': 'Cyberangriffe auf deutsche Infrastruktur', 'cyberangriffe': 'Cyberangriffe auf deutsche Infrastruktur',
'deepfakes': 'Rechtliche Lage von Deepfakes in Deutschland' '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 ==================== */ /* ==================== 3D CAROUSEL ==================== */
var cards = document.querySelectorAll('.carousel-card'); var cards = document.querySelectorAll('.carousel-card');
@@ -427,7 +439,8 @@ function mdToHtml(md) {
} }
function loadLiveData() { 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 (r) { if (!r.ok) throw new Error(r.status); return r.json(); })
.then(function (data) { .then(function (data) {
var inc = data.incident || {}; var inc = data.incident || {};
@@ -532,7 +545,12 @@ function mdToHtml(md) {
mentioned: '#7b7b7b' mentioned: '#7b7b7b'
}; };
var defaultLabels = { var defaultLabels = SITE_LANG === 'en' ? {
primary: 'Primary',
secondary: 'Reactions',
tertiary: 'Involved',
mentioned: 'Mentioned'
} : {
primary: 'Hauptgeschehen', primary: 'Hauptgeschehen',
secondary: 'Reaktionen', secondary: 'Reaktionen',
tertiary: 'Beteiligte', tertiary: 'Beteiligte',
@@ -582,7 +600,7 @@ function mdToHtml(md) {
legend.onAdd = function () { legend.onAdd = function () {
var div = L.DomUtil.create('div'); 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;'; 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 = '<strong style="color:#C8A851;">Legende</strong><br>'; var html = '<strong style="color:#C8A851;">' + (SITE_LANG === 'en' ? 'Legend' : 'Legende') + '</strong><br>';
['primary', 'secondary', 'tertiary', 'mentioned'].forEach(function (cat) { ['primary', 'secondary', 'tertiary', 'mentioned'].forEach(function (cat) {
if (usedCategories[cat]) { if (usedCategories[cat]) {
html += '<span style="color:' + categoryColors[cat] + ';">&#9679;</span> ' + categoryLabels[cat] + '<br>'; html += '<span style="color:' + categoryColors[cat] + ';">&#9679;</span> ' + categoryLabels[cat] + '<br>';
@@ -669,7 +687,8 @@ function mdToHtml(md) {
/* ==================== LOAD DEEPFAKES DATA ==================== */ /* ==================== LOAD DEEPFAKES DATA ==================== */
function loadDeepfakesData() { 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 (r) { if (!r.ok) throw new Error(r.status); return r.json(); })
.then(function (data) { .then(function (data) {
var excerptEl = document.getElementById('excerpt-text-deepfakes'); var excerptEl = document.getElementById('excerpt-text-deepfakes');
@@ -696,7 +715,8 @@ function mdToHtml(md) {
/* ==================== LOAD CYBERANGRIFFE DATA ==================== */ /* ==================== LOAD CYBERANGRIFFE DATA ==================== */
function loadCyberangriffeData() { 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 (r) { if (!r.ok) throw new Error(r.status); return r.json(); })
.then(function (data) { .then(function (data) {
var excerptEl = document.getElementById('excerpt-text-cyberangriffe'); var excerptEl = document.getElementById('excerpt-text-cyberangriffe');