|
|
import Foundation
|
|
|
import SwiftUI
|
|
|
import Combine
|
|
|
|
|
|
// 支持的语言枚举
|
|
|
enum Language: String, CaseIterable {
|
|
|
case system = "system"
|
|
|
case english = "en"
|
|
|
case chinese = "zh-Hans"
|
|
|
case thai = "th"
|
|
|
|
|
|
var displayName: String {
|
|
|
switch self {
|
|
|
case .system:
|
|
|
return "system_language".localized
|
|
|
case .english:
|
|
|
return "English"
|
|
|
case .chinese:
|
|
|
return "chinese_language".localized
|
|
|
case .thai:
|
|
|
return "ไทย"
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var flag: String {
|
|
|
switch self {
|
|
|
case .system:
|
|
|
return "🌐"
|
|
|
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 let systemLanguageKey = "system_language"
|
|
|
|
|
|
private init() {
|
|
|
loadLanguage()
|
|
|
}
|
|
|
|
|
|
// 检测系统语言并返回对应的支持语言
|
|
|
private func detectSystemLanguage() -> Language {
|
|
|
// 获取系统语言代码(兼容iOS 15+)
|
|
|
let systemLanguage = Locale.current.languageCode ?? "en"
|
|
|
|
|
|
// 检查是否是简体中文
|
|
|
if systemLanguage.hasPrefix("zh") {
|
|
|
return .chinese
|
|
|
}
|
|
|
|
|
|
// 检查是否是泰文
|
|
|
if systemLanguage == "th" {
|
|
|
return .thai
|
|
|
}
|
|
|
|
|
|
// 其他语言默认使用英文
|
|
|
return .english
|
|
|
}
|
|
|
|
|
|
// 加载保存的语言设置
|
|
|
private func loadLanguage() {
|
|
|
// 检查是否已经手动设置过语言
|
|
|
let hasManualLanguage = UserDefaults.standard.object(forKey: languageKey) != nil
|
|
|
|
|
|
if hasManualLanguage {
|
|
|
// 如果用户手动设置过语言,使用保存的设置
|
|
|
if let savedLanguage = UserDefaults.standard.string(forKey: languageKey),
|
|
|
let language = Language(rawValue: savedLanguage) {
|
|
|
if language == .system {
|
|
|
// 如果保存的是系统语言,检测当前系统语言
|
|
|
let systemLanguage = detectSystemLanguage()
|
|
|
currentLanguage = systemLanguage
|
|
|
} else {
|
|
|
currentLanguage = language
|
|
|
}
|
|
|
} else {
|
|
|
currentLanguage = .english
|
|
|
}
|
|
|
} else {
|
|
|
// 首次启动,默认使用系统语言
|
|
|
currentLanguage = .system
|
|
|
let systemLanguage = detectSystemLanguage()
|
|
|
|
|
|
// 保存系统语言设置
|
|
|
UserDefaults.standard.set("system", forKey: languageKey)
|
|
|
UserDefaults.standard.set(true, forKey: systemLanguageKey)
|
|
|
|
|
|
// 设置实际语言
|
|
|
switchLanguage(to: .system)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 切换语言
|
|
|
func switchLanguage(to language: Language) {
|
|
|
currentLanguage = language
|
|
|
|
|
|
if language == .system {
|
|
|
// 如果选择跟随系统,重置为系统语言
|
|
|
resetToSystemLanguage()
|
|
|
} else {
|
|
|
// 手动选择语言
|
|
|
UserDefaults.standard.set(language.rawValue, forKey: languageKey)
|
|
|
UserDefaults.standard.set(false, forKey: systemLanguageKey)
|
|
|
|
|
|
// 强制刷新所有UI
|
|
|
refreshTrigger = UUID()
|
|
|
|
|
|
// 通知语言变化
|
|
|
NotificationCenter.default.post(name: .languageChanged, object: language)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 重置为系统语言
|
|
|
func resetToSystemLanguage() {
|
|
|
let systemLanguage = detectSystemLanguage()
|
|
|
currentLanguage = systemLanguage
|
|
|
UserDefaults.standard.set(systemLanguage.rawValue, forKey: languageKey)
|
|
|
UserDefaults.standard.set(true, forKey: systemLanguageKey)
|
|
|
|
|
|
// 强制刷新所有UI
|
|
|
refreshTrigger = UUID()
|
|
|
|
|
|
// 通知语言变化
|
|
|
NotificationCenter.default.post(name: .languageChanged, object: systemLanguage)
|
|
|
}
|
|
|
|
|
|
// 检查当前是否使用系统语言
|
|
|
var isUsingSystemLanguage: Bool {
|
|
|
return UserDefaults.standard.bool(forKey: systemLanguageKey)
|
|
|
}
|
|
|
|
|
|
// 获取本地化字符串
|
|
|
func localizedString(for key: String) -> String {
|
|
|
let bundle = Bundle.main
|
|
|
|
|
|
// 确定要使用的语言
|
|
|
let languageToUse: String
|
|
|
if currentLanguage == .system {
|
|
|
// 如果选择跟随系统,检测系统语言
|
|
|
let systemLanguage = detectSystemLanguage()
|
|
|
languageToUse = systemLanguage.rawValue
|
|
|
} else {
|
|
|
languageToUse = currentLanguage.rawValue
|
|
|
}
|
|
|
|
|
|
if let path = bundle.path(forResource: languageToUse, 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")
|
|
|
} |