From ce38da1376534f69b103fcfe1f122e5929efb112 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 4 Oct 2026 20:03:01 +0200 Subject: [PATCH] Die Auswahlliste klappte hinter dem Dialog auf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ein `` mit `showModal()` liegt in der Top-Layer des Browsers, über allem — unabhängig von `z-index`. Die Liste hing am `body` und verschwand deshalb hinter genau dem Dialog, in dem ihr Knopf steht. Jetzt wird sie in den Dialog gehängt, wenn es einen gibt. Mit `elementFromPoint` nachgeprüft: an ihrer Stelle liegt wirklich ein Listeneintrag obenauf. Dazu zwei Stellen, die zu der Vermutung geführt haben, die Spracheinstellung wirke nicht: „Übersetzungen holen" stand stur auf en-US. Neben einem Server, der auf Deutsch steht, liest sich das wie eine Aussage über den Server. Vorgewählt wird jetzt die eigene Sprache, sonst die erste, die nicht schon die des Servers ist — und der Text nennt die Serversprache. Und „Meine Sprache" sagt jetzt deutlich, wenn sie abweicht. Sie ändert nicht, was der Server holt, nur was man selbst sieht: steht sie auf Englisch, während der Server auf Deutsch holt, sieht die ganze Mediathek englisch aus und jedes Auffrischen scheint wirkungslos. Co-Authored-By: Claude Opus 5 --- web/app/src/auswahl.ts | 8 +++++++- web/app/src/views/admin.ts | 42 +++++++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/web/app/src/auswahl.ts b/web/app/src/auswahl.ts index 98a2a11..c785d8b 100644 --- a/web/app/src/auswahl.ts +++ b/web/app/src/auswahl.ts @@ -126,7 +126,13 @@ export function auswahl(optionen: Option[], vorgabe = ''): Auswahlfeld { if (e.key === 'Tab') schliessen(); }; - document.body.appendChild(box); + // **In den Dialog, wenn es einen gibt.** + // + // Ein `` mit `showModal()` liegt in der Top-Layer des Browsers — + // über allem, unabhängig von `z-index`. Eine Liste am `body` verschwand + // deshalb hinter dem Dialog, in dem ihr Knopf steht. Im Dialog selbst + // liegt sie mit ihm in derselben Ebene. + (knopf.closest('dialog') ?? document.body).appendChild(box); offen = box; knopf.setAttribute('aria-expanded', 'true'); diff --git a/web/app/src/views/admin.ts b/web/app/src/views/admin.ts index 488d0ba..1487f64 100644 --- a/web/app/src/views/admin.ts +++ b/web/app/src/views/admin.ts @@ -1140,12 +1140,27 @@ function sprachbereich(): HTMLElement { // **Die eigene Sprache, getrennt von der des Servers.** Die obere // bestimmt, was geholt wird; diese nur, was man selbst zu sehen bekommt. + // **Weicht sie ab, steht das deutlich dabei.** + // + // Eine eigene Sprache ändert nicht, was der Server holt — nur was man + // selbst sieht. Steht sie auf Englisch, während der Server auf Deutsch + // holt, sieht die ganze Mediathek englisch aus, und jedes „Metadaten + // auffrischen" scheint wirkungslos. Genau in diese Falle läuft man, + // ohne je zu erfahren, warum. + const weichtAb = eigeneSprache !== null && eigeneSprache !== stand.language; + const serversprache = sprachen.find(x => x.wert === stand.language)?.text ?? stand.language; + liste.appendChild(zeile( - 'Meine Sprache', + weichtAb ? 'Meine Sprache — weicht ab' : 'Meine Sprache', eigeneSprache ? (sprachen.find(x => x.wert === eigeneSprache)?.text ?? eigeneSprache) : 'Wie der Server', - 'Gilt nur für dich. Was nicht übersetzt vorliegt, erscheint weiterhin in ' - + 'der Sprache des Servers.', + weichtAb + ? `Du siehst alles auf ${sprachen.find(x => x.wert === eigeneSprache)?.text ?? eigeneSprache}, ` + + `obwohl der Server auf ${serversprache} holt. Titel ohne Übersetzung bleiben ` + + `auf ${serversprache}. Auf „Wie der Server" stellen, um zu sehen, was wirklich ` + + 'gespeichert ist.' + : 'Gilt nur für dich. Was nicht übersetzt vorliegt, erscheint weiterhin in ' + + 'der Sprache des Servers.', () => dialog({ titel: 'Meine Sprache', text: 'Die Metadaten liegen in der Sprache des Servers vor. Eine andere ' @@ -1167,14 +1182,27 @@ function sprachbereich(): HTMLElement { liste.appendChild(zeile( 'Übersetzungen holen', - 'Füllt eine zweite Sprache für alle Titel auf', - 'Kostet je Titel eine Anfrage an TMDB und dauert entsprechend. ' - + 'Danach sehen Benutzer mit dieser Sprache die übersetzten Titel.', + `Füllt eine zweite Sprache neben ${serversprache} auf`, + `Der Bestand liegt auf ${serversprache} vor. Das hier legt zusätzlich ` + + 'eine zweite Fassung an, für Benutzer, die eine andere Sprache gewählt ' + + 'haben — am Bestand selbst ändert es nichts. Kostet je Titel eine ' + + 'Anfrage an TMDB.', () => dialog({ titel: 'Übersetzungen holen', + text: `Die Titel des Servers bleiben auf ${serversprache}. Geholt wird ` + + 'eine zusätzliche Fassung, die nur Benutzer mit genau dieser Sprache ' + + 'zu sehen bekommen.', felder: [{ name: 'sprache', beschriftung: 'Für welche Sprache', - auswahl: sprachen, wert: eigeneSprache ?? 'en-US', + // **Nicht stur en-US.** Stand dort „Englisch", während der Server + // auf Deutsch steht, las sich das wie eine Aussage über den + // Server — und führte zu der Vermutung, die Spracheinstellung + // wirke nicht. Vorgewählt wird die eigene Sprache, sonst die + // erste, die nicht schon die des Servers ist. + auswahl: sprachen, + wert: eigeneSprache + ?? sprachen.find(x => x.wert !== stand.language)?.wert + ?? stand.language, }], bestaetigen: 'Holen', tun: async wert => {