import Foundation import SwiftUI /// 多语言管理工具类 /// 提供便捷的本地化字符串获取和语言切换功能 /// /// 默认语言策略: /// - 应用全局默认语言为英文,不依赖系统语言设置 /// - 用户可通过语言设置界面手动切换到其他支持的语言 /// - 用户的语言选择会保存在UserDefaults中,下次启动时保持 @MainActor class LocalizationManager: ObservableObject { // MARK: - 单例 static let shared = LocalizationManager() // MARK: - 支持的语言 enum SupportedLanguage: String, CaseIterable { case english = "en" case chineseSimplified = "zh-Hans" var displayName: String { switch self { case .english: return "English" case .chineseSimplified: return "简体中文" } } var localizedDisplayName: String { switch self { case .english: return "English" case .chineseSimplified: return "简体中文" } } } // MARK: - 当前语言 @Published var currentLanguage: SupportedLanguage { didSet { do { try KeychainManager.shared.storeString(currentLanguage.rawValue, forKey: "AppLanguage") } catch { debugErrorSync("❌ 保存语言设置失败: \(error)") } // 通知视图更新 objectWillChange.send() } } private init() { // 从 Keychain 读取保存的语言设置 let savedLanguage: String? do { savedLanguage = try KeychainManager.shared.retrieveString(forKey: "AppLanguage") } catch { debugErrorSync("❌ 读取语言设置失败: \(error)") savedLanguage = nil } if let language = savedLanguage, let supportedLanguage = SupportedLanguage(rawValue: language) { self.currentLanguage = supportedLanguage } else { // 如果没有保存过语言设置,使用系统首选语言 self.currentLanguage = Self.getSystemPreferredLanguage() } } // MARK: - 本地化方法 /// 获取本地化字符串 /// - Parameters: /// - key: 本地化 key /// - arguments: 格式化参数 /// - Returns: 本地化后的字符串 func localizedString(_ key: String, arguments: CVarArg...) -> String { let format = getLocalizedString(for: key) if arguments.isEmpty { return format } else { return String(format: format, arguments: arguments) } } /// 获取本地化字符串(私有方法) private func getLocalizedString(for key: String) -> String { guard let path = Bundle.main.path(forResource: currentLanguage.rawValue, ofType: "lproj"), let bundle = Bundle(path: path) else { // 如果找不到对应语言包,返回 key 本身 return NSLocalizedString(key, comment: "") } return NSLocalizedString(key, bundle: bundle, comment: "") } // MARK: - 语言切换 /// 切换到指定语言 /// - Parameter language: 目标语言 func switchLanguage(to language: SupportedLanguage) { currentLanguage = language } /// 获取系统首选语言 /// 注意:应用全局默认语言已设置为英文,用户可通过设置手动切换语言 private static func getSystemPreferredLanguage() -> SupportedLanguage { // 全局默认语言设置为英文 // 用户仍可通过语言设置界面切换到其他支持的语言 return .english } } // MARK: - SwiftUI Extensions // extension View { // /// 应用本地化字符串 // /// - Parameter key: 本地化 key // /// - Returns: 带有本地化文本的视图 // @MainActor // func localized(_ key: String) -> some View { // self.modifier(LocalizedTextModifier(key: key)) // } // } // MARK: - 便捷方法 // extension String { // /// 获取本地化字符串 // @MainActor // var localized: String { // return LocalizationManager.shared.localizedString(self) // } // /// 获取本地化字符串(带参数) // @MainActor // func localized(arguments: CVarArg...) -> String { // return LocalizationManager.shared.localizedString(self, arguments: arguments) // } // }