Version 1.4 - Translations, Like toasts Queue redesign.
This commit is contained in:
@@ -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())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user