Version 1.4 - Translations, Like toasts Queue redesign.

This commit is contained in:
2026-04-09 16:54:41 +02:00
parent ec1ffcb0b1
commit 5f3902cb54
30 changed files with 3472 additions and 654 deletions
@@ -0,0 +1,84 @@
//
// 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())
}
}