|
|
import Foundation
|
|
|
import SwiftUI
|
|
|
import Combine
|
|
|
|
|
|
// 支持的语言枚举
|
|
|
enum Language: String, CaseIterable {
|
|
|
case english = "en"
|
|
|
case chinese = "zh-Hans"
|
|
|
case thai = "th"
|
|
|
|
|
|
var displayName: String {
|
|
|
switch self {
|
|
|
case .english:
|
|
|
return "English"
|
|
|
case .chinese:
|
|
|
return NSLocalizedString("chinese_language", comment: "Chinese language")
|
|
|
case .thai:
|
|
|
return "ไทย"
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var flag: String {
|
|
|
switch self {
|
|
|
case .english:
|
|
|
return "🇺🇸"
|
|
|
case .chinese:
|
|
|
return "🇨🇳"
|
|
|
case .thai:
|
|
|
return "🇹🇭"
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 语言管理器
|
|
|
class LanguageManager: ObservableObject {
|
|
|
static let shared = LanguageManager()
|
|
|
|
|
|
@Published var currentLanguage: Language = .english
|
|
|
@Published var refreshTrigger = UUID() // 用于强制刷新UI
|
|
|
|
|
|
private let languageKey = "selected_language"
|
|
|
|
|
|
private init() {
|
|
|
loadLanguage()
|
|
|
}
|
|
|
|
|
|
// 加载保存的语言设置
|
|
|
private func loadLanguage() {
|
|
|
if let savedLanguage = UserDefaults.standard.string(forKey: languageKey),
|
|
|
let language = Language(rawValue: savedLanguage) {
|
|
|
currentLanguage = language
|
|
|
} else {
|
|
|
// 默认使用英文
|
|
|
currentLanguage = .english
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 切换语言
|
|
|
func switchLanguage(to language: Language) {
|
|
|
currentLanguage = language
|
|
|
UserDefaults.standard.set(language.rawValue, forKey: languageKey)
|
|
|
|
|
|
// 强制刷新所有UI
|
|
|
refreshTrigger = UUID()
|
|
|
|
|
|
// 通知语言变化
|
|
|
NotificationCenter.default.post(name: .languageChanged, object: language)
|
|
|
}
|
|
|
|
|
|
// 获取本地化字符串
|
|
|
func localizedString(for key: String) -> String {
|
|
|
let bundle = Bundle.main
|
|
|
let language = currentLanguage.rawValue
|
|
|
|
|
|
if let path = bundle.path(forResource: language, ofType: "lproj"),
|
|
|
let languageBundle = Bundle(path: path) {
|
|
|
return languageBundle.localizedString(forKey: key, value: key, table: nil)
|
|
|
}
|
|
|
|
|
|
// 如果找不到本地化文件,返回英文
|
|
|
if let path = bundle.path(forResource: "en", ofType: "lproj"),
|
|
|
let languageBundle = Bundle(path: path) {
|
|
|
return languageBundle.localizedString(forKey: key, value: key, table: nil)
|
|
|
}
|
|
|
|
|
|
return key
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 本地化字符串扩展
|
|
|
extension String {
|
|
|
var localized: String {
|
|
|
return LanguageManager.shared.localizedString(for: self)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 响应式本地化文本视图
|
|
|
struct LocalizedText: View {
|
|
|
let key: String
|
|
|
@ObservedObject private var languageManager = LanguageManager.shared
|
|
|
|
|
|
init(_ key: String) {
|
|
|
self.key = key
|
|
|
}
|
|
|
|
|
|
var body: some View {
|
|
|
Text(languageManager.localizedString(for: key))
|
|
|
.id(languageManager.refreshTrigger) // 强制刷新
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 通知名称扩展
|
|
|
extension Notification.Name {
|
|
|
static let languageChanged = Notification.Name("languageChanged")
|
|
|
} |