
- 注释掉Podfile中的Alamofire依赖,更新Podfile.lock以反映更改。 - 在yana/APIs/API-README.md中新增自动认证Header机制的详细文档,描述其工作原理、实现细节及最佳实践。 - 在yana/yanaApp.swift中将print语句替换为debugInfo以增强调试信息的输出。 - 在API相关文件中实现用户认证状态检查和相关header的自动添加逻辑,提升API请求的安全性和用户体验。 - 更新多个文件中的日志输出,确保在DEBUG模式下提供详细的调试信息。
146 lines
4.6 KiB
Swift
146 lines
4.6 KiB
Swift
import Foundation
|
||
import SwiftUI
|
||
|
||
/// 多语言管理工具类
|
||
/// 提供便捷的本地化字符串获取和语言切换功能
|
||
///
|
||
/// 默认语言策略:
|
||
/// - 应用全局默认语言为英文,不依赖系统语言设置
|
||
/// - 用户可通过语言设置界面手动切换到其他支持的语言
|
||
/// - 用户的语言选择会保存在UserDefaults中,下次启动时保持
|
||
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 {
|
||
debugError("❌ 保存语言设置失败: \(error)")
|
||
}
|
||
// 通知视图更新
|
||
objectWillChange.send()
|
||
}
|
||
}
|
||
|
||
private init() {
|
||
// 从 Keychain 读取保存的语言设置
|
||
let savedLanguage: String?
|
||
do {
|
||
savedLanguage = try KeychainManager.shared.retrieveString(forKey: "AppLanguage")
|
||
} catch {
|
||
debugError("❌ 读取语言设置失败: \(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: 带有本地化文本的视图
|
||
func localized(_ key: String) -> some View {
|
||
self.modifier(LocalizedTextModifier(key: key))
|
||
}
|
||
}
|
||
|
||
/// 本地化文本修饰器
|
||
struct LocalizedTextModifier: ViewModifier {
|
||
let key: String
|
||
@ObservedObject private var localizationManager = LocalizationManager.shared
|
||
|
||
func body(content: Content) -> some View {
|
||
content
|
||
}
|
||
}
|
||
|
||
// MARK: - 便捷方法
|
||
extension String {
|
||
/// 获取本地化字符串
|
||
var localized: String {
|
||
return LocalizationManager.shared.localizedString(self)
|
||
}
|
||
|
||
/// 获取本地化字符串(带参数)
|
||
func localized(arguments: CVarArg...) -> String {
|
||
return LocalizationManager.shared.localizedString(self, arguments: arguments)
|
||
}
|
||
} |