85 lines
2.0 KiB
Swift
85 lines
2.0 KiB
Swift
//
|
|
// ServicesMALocaleManager.swift
|
|
// Mobile Music Assistant
|
|
//
|
|
// Created by Sven Hanold on 09.04.26.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
// MARK: - Supported Languages
|
|
|
|
enum SupportedLanguage: String, CaseIterable, Identifiable {
|
|
case en = "en"
|
|
case de = "de"
|
|
case fr = "fr"
|
|
case es = "es"
|
|
|
|
var id: String { rawValue }
|
|
|
|
/// Native display name (endonym) — always shown in the language's own script
|
|
var endonym: String {
|
|
switch self {
|
|
case .en: return "English"
|
|
case .de: return "Deutsch"
|
|
case .fr: return "Français"
|
|
case .es: return "Español"
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Locale Manager
|
|
|
|
@Observable
|
|
class MALocaleManager {
|
|
/// nil means "System" (no override — iOS uses device language)
|
|
var selectedLanguageCode: String? {
|
|
didSet {
|
|
if let code = selectedLanguageCode {
|
|
UserDefaults.standard.set(code, forKey: "appLanguageOverride")
|
|
} else {
|
|
UserDefaults.standard.removeObject(forKey: "appLanguageOverride")
|
|
}
|
|
}
|
|
}
|
|
|
|
init() {
|
|
selectedLanguageCode = UserDefaults.standard.string(forKey: "appLanguageOverride")
|
|
}
|
|
|
|
/// The locale to inject into the environment. nil = let iOS choose.
|
|
var overrideLocale: Locale? {
|
|
guard let code = selectedLanguageCode else { return nil }
|
|
return Locale(identifier: code)
|
|
}
|
|
}
|
|
|
|
// MARK: - Environment Key
|
|
|
|
private struct LocaleManagerKey: EnvironmentKey {
|
|
static let defaultValue = MALocaleManager()
|
|
}
|
|
|
|
extension EnvironmentValues {
|
|
var localeManager: MALocaleManager {
|
|
get { self[LocaleManagerKey.self] }
|
|
set { self[LocaleManagerKey.self] = newValue }
|
|
}
|
|
}
|
|
|
|
// MARK: - Locale Applied Modifier
|
|
|
|
struct LocaleAppliedModifier: ViewModifier {
|
|
@Environment(\.localeManager) var localeManager
|
|
|
|
func body(content: Content) -> some View {
|
|
content.environment(\.locale, localeManager.overrideLocale ?? .current)
|
|
}
|
|
}
|
|
|
|
extension View {
|
|
func applyLocale() -> some View {
|
|
modifier(LocaleAppliedModifier())
|
|
}
|
|
}
|