feat(frontend): Light-i18n + Org-Sprache durch /auth/me

Backend:
- UserMeResponse um output_language (de | en) erweitert.
- /auth/me liefert die Org-Sprache aus organization_settings.

Frontend:
- Neu: static/js/i18n.js mit T(key)-Helper, I18N.load(lang) und
  applyDom() ueber data-i18n + data-i18n-attr.
- Neu: static/i18n/de.json + en.json (sichtbare Bereiche: Sidebar,
  Header, Modal-Titel, Faktencheck-Status, Refresh-Hinweise).
- dashboard.html: i18n.js Script-Tag vor api.js, data-i18n auf den
  prominenten Strings (Abmelden, + Neuer Fall, Alle/Eigene, Sidebar-
  Sektionen, Bericht exportieren, Faktencheck-Tab, Lage anlegen).
  Tutorial.init() entfernt aus DOMContentLoaded.
- components.js: factCheckLabels/Tooltips/ChipLabels als Getter ueber
  T() mit DE-Fallbacks.
- app.js: vor Setup wird I18N.load(user.output_language) aufgerufen und
  applyDom() ausgefuehrt. Tutorial.init() laeuft nur bei lang === de.

Phase 6 von 8 (eng_demo / Org-Sprache).
Dieser Commit ist enthalten in:
Claude Code
2026-05-13 21:14:56 +00:00
Ursprung 4e51834163
Commit 3f0e680446
8 geänderte Dateien mit 271 neuen und 17 gelöschten Zeilen

64
src/static/i18n/de.json Normale Datei
Datei anzeigen

@@ -0,0 +1,64 @@
{
"sidebar.live_monitoring": "Live-Monitoring",
"sidebar.research": "Recherchen",
"sidebar.empty": "Keine Lagen vorhanden",
"header.logout": "Abmelden",
"header.new_incident": "+ Neuer Fall",
"header.theme_toggle": "Theme wechseln",
"header.notifications": "Benachrichtigungen",
"filter.all": "Alle",
"filter.own": "Eigene",
"filter.everything": "Alles",
"common.close": "Schließen",
"common.cancel": "Abbrechen",
"common.save": "Speichern",
"common.delete": "Löschen",
"common.edit": "Bearbeiten",
"common.loading": "Lädt...",
"common.confirm": "Bestätigen",
"common.error": "Fehler",
"modal.new_incident.title": "Neue Lage anlegen",
"modal.new_incident.title_field": "Titel des Vorfalls",
"modal.new_incident.description": "Beschreibung / Kontext",
"modal.new_incident.enhance": "Beschreibung generieren",
"modal.new_incident.visibility": "Sichtbarkeit",
"modal.new_incident.visibility_public": "Öffentlich",
"modal.new_incident.visibility_private": "Privat",
"modal.new_incident.submit": "Lage anlegen",
"modal.sources.title": "Quellenverwaltung",
"modal.sources.approve_all_high": "Alle ≥ 0.85 genehmigen",
"modal.export.title": "Bericht exportieren",
"modal.fc_status.title": "Statusänderung Faktencheck",
"tile.factcheck": "Faktencheck",
"tile.research_evaluated": "Recherche-Lagen werden mehrfach evaluiert...",
"tile.summary": "Lagebild",
"tile.summary_research": "Recherchebericht",
"tile.timeline": "Zeitachse",
"tile.map": "Karte",
"tile.sources": "Quellen",
"fc.label.confirmed": "Bestätigt durch mehrere Quellen",
"fc.label.unconfirmed": "Nicht unabhängig bestätigt",
"fc.label.contradicted": "Widerlegt",
"fc.label.developing": "Faktenlage noch im Fluss",
"fc.label.established": "Gesicherter Fakt (3+ Quellen)",
"fc.label.disputed": "Umstrittener Sachverhalt",
"fc.label.unverified": "Nicht unabhängig verifizierbar",
"fc.tooltip.confirmed": "Bestätigt: Mindestens zwei unabhängige, seriöse Quellen stützen diese Aussage übereinstimmend.",
"fc.tooltip.established": "Gesichert: Drei oder mehr unabhängige Quellen bestätigen den Sachverhalt. Hohe Verlässlichkeit.",
"fc.tooltip.developing": "Unklar: Die Faktenlage ist noch im Fluss. Neue Informationen können das Bild verändern.",
"fc.tooltip.unconfirmed": "Unbestätigt: Bisher nur aus einer Quelle bekannt. Eine unabhängige Bestätigung steht aus.",
"fc.tooltip.unverified": "Ungeprüft: Die Aussage konnte bisher nicht anhand verfügbarer Quellen überprüft werden.",
"fc.tooltip.disputed": "Umstritten: Quellen widersprechen sich. Es gibt sowohl stützende als auch widersprechende Belege.",
"fc.tooltip.contradicted": "Widerlegt: Zuverlässige Quellen widersprechen dieser Aussage. Wahrscheinlich falsch.",
"fc.chip.confirmed": "Bestätigt",
"fc.chip.unconfirmed": "Unbestätigt",
"fc.chip.contradicted": "Widerlegt",
"fc.chip.developing": "Unklar",
"fc.chip.established": "Gesichert",
"fc.chip.disputed": "Umstritten",
"fc.chip.unverified": "Ungeprüft",
"refresh.no_developments": "Keine neuen Entwicklungen",
"refresh.new_articles_suffix": "neue Artikel",
"refresh.confirmed_suffix": "Fakten bestätigt",
"refresh.contradicted_suffix": "widerlegt"
}

64
src/static/i18n/en.json Normale Datei
Datei anzeigen

@@ -0,0 +1,64 @@
{
"sidebar.live_monitoring": "Live monitoring",
"sidebar.research": "Research",
"sidebar.empty": "No situations yet",
"header.logout": "Sign out",
"header.new_incident": "+ New situation",
"header.theme_toggle": "Toggle theme",
"header.notifications": "Notifications",
"filter.all": "All",
"filter.own": "Own",
"filter.everything": "Everything",
"common.close": "Close",
"common.cancel": "Cancel",
"common.save": "Save",
"common.delete": "Delete",
"common.edit": "Edit",
"common.loading": "Loading...",
"common.confirm": "Confirm",
"common.error": "Error",
"modal.new_incident.title": "Create new situation",
"modal.new_incident.title_field": "Incident title",
"modal.new_incident.description": "Description / context",
"modal.new_incident.enhance": "Generate description",
"modal.new_incident.visibility": "Visibility",
"modal.new_incident.visibility_public": "Public",
"modal.new_incident.visibility_private": "Private",
"modal.new_incident.submit": "Create situation",
"modal.sources.title": "Source management",
"modal.sources.approve_all_high": "Approve all ≥ 0.85",
"modal.export.title": "Export report",
"modal.fc_status.title": "Fact-check status change",
"tile.factcheck": "Fact check",
"tile.research_evaluated": "Research situations are evaluated multiple times...",
"tile.summary": "Briefing",
"tile.summary_research": "Research report",
"tile.timeline": "Timeline",
"tile.map": "Map",
"tile.sources": "Sources",
"fc.label.confirmed": "Confirmed by multiple sources",
"fc.label.unconfirmed": "Not independently confirmed",
"fc.label.contradicted": "Contradicted",
"fc.label.developing": "Facts still developing",
"fc.label.established": "Established fact (3+ sources)",
"fc.label.disputed": "Disputed matter",
"fc.label.unverified": "Not independently verifiable",
"fc.tooltip.confirmed": "Confirmed: at least two independent, reputable sources support this claim consistently.",
"fc.tooltip.established": "Established: three or more independent sources confirm the matter. High reliability.",
"fc.tooltip.developing": "Developing: the facts are still in flux. New information may change the picture.",
"fc.tooltip.unconfirmed": "Unconfirmed: known from only one source so far. Independent confirmation is pending.",
"fc.tooltip.unverified": "Unverified: the claim could not yet be checked against available sources.",
"fc.tooltip.disputed": "Disputed: sources disagree. There is both supporting and contradicting evidence.",
"fc.tooltip.contradicted": "Contradicted: reliable sources contradict this claim. Likely false.",
"fc.chip.confirmed": "Confirmed",
"fc.chip.unconfirmed": "Unconfirmed",
"fc.chip.contradicted": "Contradicted",
"fc.chip.developing": "Developing",
"fc.chip.established": "Established",
"fc.chip.disputed": "Disputed",
"fc.chip.unverified": "Unverified",
"refresh.no_developments": "No new developments",
"refresh.new_articles_suffix": "new articles",
"refresh.confirmed_suffix": "facts confirmed",
"refresh.contradicted_suffix": "contradicted"
}