
- 在Package.swift中注释掉旧的swift-composable-architecture依赖,并添加swift-case-paths依赖。 - 在Podfile中将iOS平台版本更新至16.0,并移除QCloudCOSXML/Transfer依赖,改为使用QCloudCOSXML。 - 更新Podfile.lock以反映依赖变更,确保项目依赖的准确性。 - 新增架构分析需求文档,明确项目架构评估和改进建议。 - 在多个文件中实现async/await语法,提升异步操作的可读性和性能。 - 更新日志输出方法,确保在调试模式下提供一致的调试信息。 - 优化多个视图组件,提升用户体验和代码可维护性。
140 lines
4.5 KiB
Swift
140 lines
4.5 KiB
Swift
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)
|
||
// }
|
||
// }
|