diff --git a/Flixy/Resources/Localizable.xcstrings b/Flixy/Resources/Localizable.xcstrings index ce3ae0e..a2e7d40 100644 --- a/Flixy/Resources/Localizable.xcstrings +++ b/Flixy/Resources/Localizable.xcstrings @@ -1542,26 +1542,6 @@ } } } - }, - "episode.number" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Episode %lld" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Episode %lld" - } - } - } - }, - "episode.number %@" : { - }, "episode.short %lld %lld" : { "comment" : "Staffel- und Folgennummer", @@ -4054,23 +4034,6 @@ } } }, - "season.number" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Staffel %lld" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Season %lld" - } - } - } - }, "season.short %lld" : { "comment" : "Platzhalter: Staffelnummer", "extractionState" : "stale", @@ -6238,7 +6201,41 @@ } } } + }, + "season.number %lld" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Staffel %lld" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Season %lld" + } + } + } + }, + "episode.number %lld" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folge %lld" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Episode %lld" + } + } + } } }, "version" : "1.1" -} \ No newline at end of file +} diff --git a/Flixy/Views/Player/PlayerView.swift b/Flixy/Views/Player/PlayerView.swift index a26f175..885daf4 100644 --- a/Flixy/Views/Player/PlayerView.swift +++ b/Flixy/Views/Player/PlayerView.swift @@ -68,40 +68,47 @@ struct PlayerView: View { // Deckt den Umstieg ab. Ohne sie sieht man den Filmanfang, // während der neue Stream anläuft — und denkt, die Stelle sei // weg. Die Abdeckung nennt sie ausdrücklich. + // + // **Und dann nichts anderes.** Die Abdeckung ist eine ganze + // Seite, kein Schleier: legt sich das Übrige darüber, stehen + // Bedienelemente und Kreisel mitten im Satz „Stelle wird + // wiederhergestellt" — zwei Ladeanzeigen übereinander, eine + // davon in einem Knopf, den man in dem Moment gar nicht + // drücken soll. Die Kopfzeile bleibt: sie ist der Weg zurück. if let target = model.resumeTarget { restoring(to: target) - } + } else { + switch model.phase { + case .preparing: + preparing(for: model) - switch model.phase { - case .preparing: - preparing(for: model) + case .failed(let message): + failure(message: message) - case .failed(let message): - failure(message: message) + case .playing: + // Wartet auf Daten: ohne Anzeige sieht das aus wie ein + // Standbild, und man weiß nicht, ob noch etwas kommt. + // + // Nur, solange die Bedienelemente aus sind. Sind sie + // an, steht der Kreisel **im** Abspielknopf — dort, wo + // sonst das Symbol ist. Vorher lag er dahinter und das + // Dreieck davor: es sah pausiert aus, war es nicht. + if model.isBuffering && !showsControls { + ProgressView() + .tint(.white) + .scaleEffect(1.4) + .transition(.opacity) + } - case .playing: - // Wartet auf Daten: ohne Anzeige sieht das aus wie ein - // Standbild, und man weiß nicht, ob noch etwas kommt. - // - // Nur, solange die Bedienelemente aus sind. Sind sie an, - // steht der Kreisel **im** Abspielknopf — dort, wo sonst - // das Symbol ist. Vorher lag er dahinter und das Dreieck - // davor: es sah pausiert aus, war es aber nicht. - if model.isBuffering && !showsControls { - ProgressView() - .tint(.white) - .scaleEffect(1.4) - .transition(.opacity) + if showsControls { + controls(for: model).transition(.opacity) + } + // Überspringen und „Nächste Folge" liegen außerhalb + // der Bedienelemente: sie sollen auch dann erscheinen, + // wenn die ausgeblendet sind — sonst müsste man erst + // antippen, um das Intro überspringen zu können. + overlayActions(for: model) } - - if showsControls { - controls(for: model).transition(.opacity) - } - // Überspringen und „Nächste Folge" liegen außerhalb der - // Bedienelemente: sie sollen auch dann erscheinen, wenn - // die ausgeblendet sind — sonst müsste man erst antippen, - // um das Intro überspringen zu können. - overlayActions(for: model) } // Die Kopfzeile liegt über allem und erscheint auch während