Die Tonspur wird aus der Datei gewählt, nicht aus dem Stream
Im Spurenblatt stand eine einzige Zeile: „Unbekannt". Das ist der Name, den AVFoundation einer namenlosen Spur gibt — und bei einem umgerechneten Stream liefert der Server genau eine. Der Player hatte nichts zur Auswahl, weil die Wahl längst gefallen war, bevor er gefragt wurde. Gewählt wird jetzt aus den Spuren, die **in der Datei** stehen, und zwar bevor der Stream ausgehandelt wird. Die Nummer geht als `audioStreamIndex` mit hinaus; wer mitten im Film umstellt, bekommt den Stream neu — ausser bei unveränderter Wiedergabe, wo der Player ohne Unterbrechung umschaltet. Die Abwägung selbst macht `AudioTrackChooser`: gemerkte Spur, dann Wunschsprache, dann Rangliste, dann Standardspur — und Audiodeskription mit deutlichem Abzug statt Ausschluss, damit eine Sprache, die es nur so gibt, immer noch besser ist als Stille. Drei Ebenen in `LanguagePreferences`: Serie, Mediathek, allgemein. Gefragt wird von unten nach oben. Die Mediathek wird nur nachgeschlagen, wenn überhaupt jemand eine Sprache je Mediathek gesetzt hat — sonst kostete jede Wiedergabe eine Anfrage für eine Ebene, die niemand benutzt. Wer von Hand umstellt, dessen Wahl wird für die Serie gemerkt, ohne Nachfrage. Der Dialog „für diese Serie merken?" ist genau die Art, die man nach dem dritten Mal wegklickt. Sichtbar ist es trotzdem: das Spurenblatt zeigt es und lässt es löschen. Dazu die Rangliste in den Einstellungen, ziehbar, und der Schalter „Audiodeskription meiden". Und die Player-Oberfläche blendet endlich als Ganzes über. Die Kopfzeile hatte gar keine Überblendung — sie sprang herein, während die Bedienung darunter verblasste. Jetzt steht die Animation an einer Stelle statt an sechs, und sie läuft über Deckkraft statt über Einfügen und Entfernen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2dbe260901
commit
596a143545
@@ -5,6 +5,10 @@
|
||||
"comment": "A separator between different parts of the episode metadata.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"%@ GB": {
|
||||
"comment": "A picker option in the settings view that lets the user select the maximum amount of storage space that can be used for downloaded content. The value is given in gigabytes.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"%@ → %@": {
|
||||
"comment": "A line in a diagnostic trace that shows a network request path and its result. The first argument is the network request path. The second argument is the network response result.",
|
||||
"isCommentAutoGenerated": true,
|
||||
@@ -17,20 +21,20 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"%@ GB": {
|
||||
"comment": "A picker option in the settings view that lets the user select the maximum amount of storage space that can be used for downloaded content. The value is given in gigabytes.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"4K": {
|
||||
"comment": "A label for a 4K video.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"720p": {
|
||||
"comment": "A label for a 720p video.",
|
||||
"Full HD": {
|
||||
"comment": "A label for a media resolution.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"1080p": {
|
||||
"comment": "A label for a 1080p video.",
|
||||
"HD": {
|
||||
"comment": "A label for a media resolution.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"SD": {
|
||||
"comment": "A label for a 720p movie.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"account.hint": {
|
||||
@@ -2195,6 +2199,108 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages.avoidAudioDescription": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Audiodeskription meiden"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Avoid audio description"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages.avoidAudioDescriptionExplanation": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Spuren, die eine Szenenbeschreibung für Sehbehinderte enthalten, werden nur genommen, wenn es keine andere in dieser Sprache gibt. Erkannt wird das am Namen der Spur — der Server kennzeichnet es nicht."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Tracks that describe the scene for blind viewers are only used when there is no other track in that language. They are recognised by name — the server doesn't flag them."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages.fallbackAdd": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Sprache hinzufügen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Add language"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages.fallbackEmpty": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Keine Ausweichsprachen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "No fallback languages"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages.fallbackExplanation": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Gilt nur, wenn ein Titel die gewünschte Tonsprache gar nicht hat. Dann wird von oben nach unten gesucht."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Applies only when a title doesn't have your preferred audio language at all. Then it works down the list."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages.fallbackHeader": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Rangliste"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Fallback order"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages.headerExplanation": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
@@ -2922,6 +3028,23 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"liveTV.recordSeries": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Serie aufnehmen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Record series"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"liveTV.recording.inProgress": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
@@ -2990,23 +3113,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"liveTV.recordSeries": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Serie aufnehmen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Record series"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"liveTV.runningNow": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
@@ -3309,6 +3415,23 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.forgetRememberedTrack": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Nicht mehr merken"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Stop remembering"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.forward10": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
@@ -3511,6 +3634,40 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.rememberedTrack": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Für diese Serie gemerkt"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Remembered for this series"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.rememberedTrackExplanation %@": {
|
||||
"extractionState": "manual",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Seit du „%@“ gewählt hast, wird diese Spur in jeder Folge genommen."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Since you picked “%@”, that track is used for every episode."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.restoring": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
@@ -3611,6 +3768,23 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.subtitleTracks": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Untertitel"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Subtitles"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.subtitlesOff": {
|
||||
"comment": "Eintrag, der die Untertitel abschaltet",
|
||||
"extractionState": "stale",
|
||||
@@ -3629,23 +3803,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.subtitleTracks": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Untertitel"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Subtitles"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"player.tracks": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
@@ -3730,23 +3887,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality.automatic": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Automatisch"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Automatic"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality.autoShort": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
@@ -3764,6 +3904,23 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality.automatic": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Automatisch"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Automatic"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality.current": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
@@ -4190,10 +4347,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"SD": {
|
||||
"comment": "A label for a 720p movie.",
|
||||
"isCommentAutoGenerated": true
|
||||
},
|
||||
"search.hint": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
|
||||
Reference in New Issue
Block a user