// // 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()) } }