Zwei Schlüssel ohne Platzhalter, zwei Kreisel übereinander

**Die Schlüssel.** Im Quelltext steht `"season.number \(season)"`, der
Schlüssel heißt damit `season.number %lld`. Im Katalog stand er ohne
Platzhalter — also traf er nie, und die App zeigte den Schlüssel selbst:
„The 50 · season.number 1 · episode.number 1". Beide umbenannt. Ein
Überbleibsel `episode.number %@` ohne eine einzige Übersetzung ist
mitgegangen, und aus „Episode" wurde „Folge", wie überall sonst im Haus.

**Die Kreisel.** Die Abdeckung beim Wiederherstellen der Stelle ist eine
ganze Seite, kein Schleier — nur lag das Übrige weiter darüber. Zu sehen
waren Bedienelemente mitten im Satz, ein Kreisel in der Abdeckung und ein
zweiter im Abspielknopf, den man in dem Moment ohnehin nicht drücken
soll. Jetzt ist die Abdeckung ausschließlich. Die Kopfzeile bleibt: sie
ist der Weg zurück.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-15 21:52:08 +02:00
co-authored by Claude Opus 5
parent 8a63f815cd
commit fc812f5a25
2 changed files with 70 additions and 66 deletions
+35 -38
View File
@@ -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"
}
}
+35 -28
View File
@@ -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