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 => {