Zwei Dinge aus deinen Einstellungs-Bildern. **Das Konto sitzt jetzt unten in der Seitenleiste**, nicht als gleichrangiger Eintrag zwischen den Mediatheken. Dort sucht man es, und von dort führt der Weg in die Einstellungen und zum Abmelden. Auch das ist eine Systemstelle — `tabViewSidebarBottomBar` —, also dieselbe Zeile, an der sie bei JellyTV steht. Auf dem iPhone gibt es sie nicht; dort bleibt es beim eigenen Eintrag. Der Buchstabe auf der Scheibe ist kein Platzhalter für ein Bild, das noch kommt: Jellyfin gibt kein Profilbild heraus, solange keines hinterlegt ist, und Plex kennt den Kontonamen am Server gar nicht. Bei Plex steht deshalb der Servername oben und darunter nichts — statt zweimal dasselbe. **Ton- und Untertitelsprache lassen sich jetzt einstellen.** Beim Durchsehen deiner Bilder ist mir aufgefallen, dass es diese Vorliebe längst gibt: der Player liest sie bei jeder Wiedergabe aus und wählt die passende Spur. Nur äußern konnte man sie nirgends — sie stand in den Voreinstellungen und blieb dort für immer leer. Eine Vorliebe, die niemand äußern kann, ist keine. Fünfzehn Sprachen, keine vollständige Liste: ein Rad mit zweihundert Einträgen, um „Deutsch" zu finden, wäre keine Hilfe. Was fehlt, kommt später mit einem Suchfeld dazu. Gebaut und übersetzt, aber **nicht angesehen**: der Simulator-Tunnel ist mitten im Prüfen abgestürzt und ließ sich nicht wieder aufbauen. Dass es die Systemstelle gibt, beweist der Compiler; wie sie aussieht, habe ich diesmal nicht gesehen. 258 Tests grün. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 lines
2.4 KiB
Swift
66 lines
2.4 KiB
Swift
import SwiftUI
|
|
import FlixyDesign
|
|
|
|
/// Welche Sprachen der Player von sich aus wählen soll.
|
|
///
|
|
/// Die Einstellung gab es schon — der Player liest sie bei jeder Wiedergabe
|
|
/// aus und wählt die passende Spur. Nur einstellen konnte man sie nirgends:
|
|
/// sie stand in den Voreinstellungen und blieb dort für immer leer. Eine
|
|
/// Vorliebe, die niemand äußern kann, ist keine.
|
|
struct LanguagesView: View {
|
|
@Environment(PlaybackSettings.self) private var settings
|
|
@Environment(\.flixyAccent) private var accent
|
|
|
|
/// Die Sprachen, die in Mediatheken tatsächlich vorkommen.
|
|
///
|
|
/// Keine vollständige Liste aller Sprachen der Welt: ein Auswahlrad mit
|
|
/// zweihundert Einträgen, um „Deutsch" zu finden, ist keine Hilfe. Was
|
|
/// fehlt, lässt sich später ergänzen — dann mit einem Suchfeld.
|
|
private static let codes = [
|
|
"de", "en", "fr", "es", "it", "nl", "pl", "pt", "ru", "sv", "da", "tr",
|
|
"ja", "ko", "zh",
|
|
]
|
|
|
|
var body: some View {
|
|
@Bindable var settings = settings
|
|
|
|
Form {
|
|
Section {
|
|
Picker("languages.audio", selection: $settings.preferredAudioLanguage) {
|
|
Text("languages.serverDefault").tag("")
|
|
ForEach(Self.codes, id: \.self) { code in
|
|
Text(name(of: code)).tag(code)
|
|
}
|
|
}
|
|
} header: {
|
|
Text("languages.audioHeader")
|
|
} footer: {
|
|
Text("languages.audioExplanation")
|
|
}
|
|
|
|
Section {
|
|
Picker("languages.subtitles", selection: $settings.preferredSubtitleLanguage) {
|
|
Text("languages.subtitlesOff").tag("")
|
|
ForEach(Self.codes, id: \.self) { code in
|
|
Text(name(of: code)).tag(code)
|
|
}
|
|
}
|
|
} header: {
|
|
Text("languages.subtitlesHeader")
|
|
} footer: {
|
|
Text("languages.subtitlesExplanation")
|
|
}
|
|
}
|
|
.tint(accent)
|
|
.scrollContentBackground(.hidden)
|
|
.background(Color.flixyCanvas)
|
|
.navigationTitle(Text("languages.title"))
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
}
|
|
|
|
/// Der Name der Sprache in der Sprache des Geräts.
|
|
private func name(of code: String) -> String {
|
|
Locale.current.localizedString(forLanguageCode: code)?.capitalized ?? code.uppercased()
|
|
}
|
|
}
|