import SwiftUI import FlixyDesign /// „Welche Tonsprache gilt hier?" — an genau zwei Orten dieselbe Frage. /// /// **Warum ein gemeinsamer Typ.** Die Frage steht einmal auf der Serienseite /// und einmal bei der Mediathek, und die Antwort bedeutet beide Male dasselbe: /// diese Ebene setzt sich gegen die darüber durch, oder sie tut es nicht. Zwei /// Auswahlknöpfe mit demselben Inhalt liefen unweigerlich auseinander — einer /// bekäme eine Sprache dazu, der andere nicht. /// /// **Ein Menü, kein `Picker`.** Die Serienseite ist eine `ScrollView`, kein /// `Form`; dort hätte ein `Picker` kein Aussehen, auf das man sich verlassen /// kann. Ein Menü sieht überall gleich aus. struct AudioLanguagePicker: View { /// Für welche Ebene gewählt wird. enum Scope { case series(String) case library(String) } let scope: Scope let title: LocalizedStringKey @Environment(LanguagePreferences.self) private var languages @Environment(\.flixyAccent) private var accent var body: some View { HStack(spacing: FlixySpacing.regular) { Text(title) .font(.flixyBody) .foregroundStyle(Color.flixyTextPrimary) Spacer(minLength: FlixySpacing.regular) Menu { // „Wie allgemein" zuerst und als Vorgabe: die meisten Ebenen // sollen nichts Eigenes sagen, sondern die Frage nach oben // durchreichen. Button { set(nil) } label: { Label("languages.inherit", systemImage: current == nil ? "checkmark" : "") } Divider() ForEach(LanguagePreferences.offeredCodes, id: \.self) { code in Button { set(code) } label: { Label(name(of: code), systemImage: current == code ? "checkmark" : "") } } } label: { HStack(spacing: FlixySpacing.tight) { Text(currentLabel) .font(.flixyBody) Image(systemName: "chevron.up.chevron.down") .font(.flixyCaption) } .foregroundStyle(accent) } } } private var current: String? { switch scope { case .series(let id): languages.audioLanguage(forSeries: id) case .library(let id): languages.audioLanguage(forLibrary: id) } } private var currentLabel: String { current.map(name(of:)) ?? String(localized: "languages.inherit") } private func set(_ code: String?) { switch scope { case .series(let id): languages.setAudioLanguage(code, forSeries: id) case .library(let id): languages.setAudioLanguage(code, forLibrary: id) } } private func name(of code: String) -> String { Locale.current.localizedString(forLanguageCode: code)?.capitalized ?? code.uppercased() } }