Files
e-party-iOS/yana/Utils/LocalizationManager.swift
edwinQQQ 01779a95c8 feat: 更新AppSettingFeature以增强用户体验和本地化支持
- 在AppSettingFeature中新增登出确认和关于我们弹窗的状态和Action。
- 更新AppSettingView以支持登出确认和关于我们弹窗的逻辑。
- 替换多个视图中的NSLocalizedString为LocalizedString,提升本地化一致性。
- 在Localizable.strings中新增相关本地化文本,确保多语言支持。
2025-07-31 18:29:03 +08:00

190 lines
6.3 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)")
}
// UserDefaults 使
UserDefaults.standard.set(currentLanguage.rawValue, forKey: "AppLanguage")
//
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()
}
// UserDefaults
UserDefaults.standard.set(self.currentLanguage.rawValue, forKey: "AppLanguage")
}
// 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)
}
}
// MARK: -
///
/// 使 LocalizationManager
/// - Parameters:
/// - key: key
/// - comment: NSLocalizedString
/// - Returns:
@MainActor
func LocalizedString(_ key: String, comment: String = "") -> String {
return LocalizationManager.shared.localizedString(key)
}
///
/// TCA reducer
/// - Parameters:
/// - key: key
/// - comment: NSLocalizedString
/// - Returns:
func LocalizedStringSync(_ key: String, comment: String = "") -> String {
// UserDefaults @MainActor
let currentLanguage = UserDefaults.standard.string(forKey: "AppLanguage") ?? "en"
//
guard let path = Bundle.main.path(forResource: currentLanguage, ofType: "lproj"),
let bundle = Bundle(path: path) else {
// key
return NSLocalizedString(key, comment: comment)
}
return NSLocalizedString(key, bundle: bundle, comment: comment)
}
// MARK: - LocalizedTextModifier
///
struct LocalizedTextModifier: ViewModifier {
let key: String
func body(content: Content) -> some View {
content
.onAppear {
//
}
}
}