Drei Gründe, warum der Mac anders aussah, und keiner davon war Geschmack. **Die Schrift.** macOS rendert dieselben Textstile deutlich kleiner als iOS: `largeTitle` misst dort 26 Punkt statt 34, Fließtext 13 statt 17. Eine Oberfläche, die auf dem iPad stimmt, wirkt damit zusammengeschrumpft. Auf dem Mac stehen jetzt feste Größen — die von iOS. Das kostet dort Dynamic Type; vertretbar, weil macOS keine systemweite Textgröße kennt und man ein Fenster stattdessen größer ziehen kann. **Der Aufmacher wächst mit.** Das war der zweite, größere Teil: das Bild ist so breit wie das Fenster, die Schrift darauf war es nicht. Bei 1280 Punkt Breite wirkt ein 34-Punkt-Titel verloren, bei 834 auf dem iPad genau richtig. Titel, Schriftzug, Angaben und Abstände richten sich jetzt nach der Breite des Aufmachers — mit dem iPad als Bezug und einem Deckel, damit ein Fenster über die ganze Wand nicht in Plakatschrift endet. Die Beschreibung bekommt außerdem eine Zeilenbreite: ein Satz über 1280 Punkt ist unlesbar, das Auge verliert die Zeile. **Die Seitenleiste.** Sie richtet sich nach ihrem Inhalt, und bei Wörtern wie „Start" fällt sie auf eine Breite zusammen, in der schon der Kontoname darunter nicht mehr Platz hatte — daher das „S…". Die Beschriftungen haben jetzt eine Mindestbreite. **Die Formulare.** Auf dem Mac nahm SwiftUI den Spalten-Stil: Beschriftungen rechts ausgerichtet, keine abgesetzten Abschnitte. Jetzt derselbe gruppierte Stil wie auf iOS. Dazu: Scrollbalken sind weg. Der graue Streifen unter dem Aufmacher kam daher, dass in den Systemeinstellungen „Scrollbalken immer einblenden" steht — dagegen reicht `.hidden` nicht, `.never` schon. Und das Fenster öffnet mit 1280 × 820 statt in Notizzettelgröße, ohne graue Titelleiste. 263 Tests grün, iOS baut unverändert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
74 lines
2.7 KiB
Swift
74 lines
2.7 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 {
|
|
SettingsHeader(
|
|
symbol: "captions.bubble",
|
|
colour: SettingsPalette.languages,
|
|
title: "languages.title",
|
|
explanation: "languages.headerExplanation"
|
|
)
|
|
|
|
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)
|
|
.flixyForm()
|
|
.scrollContentBackground(.hidden)
|
|
.background(Color.flixyCanvas)
|
|
.navigationTitle(Text("languages.title"))
|
|
.flixyInlineTitle()
|
|
}
|
|
|
|
/// 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()
|
|
}
|
|
}
|