feat: 添加语言切换即时生效功能

用户体验改进:
- 选择新语言后立即弹出确认对话框
- 提供"立即重启"和"取消"两个选项
- 点击"立即重启"后自动应用语言设置并重启应用
- 点击"取消"则保持当前语言不变

技术实现:
- 添加 showingLanguageChangeAlert 状态管理对话框
- 添加 pendingLanguage 临时存储用户选择
- 修改 Picker 的 set 闭包,选择新语言时触发对话框
- 确认后调用 exit(0) 优雅退出应用

新增本地化字符串:
- settings.languageChangeAlertTitle (8种语言)
- settings.languageChangeAlertMessage (8种语言)
- settings.restartNow (8种语言)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
empty
2026-01-10 14:42:25 +08:00
parent 5475e00016
commit 565c92795a
2 changed files with 178 additions and 2 deletions

View File

@@ -9846,7 +9846,163 @@
"适用于较旧设备或生成失败时": {},
"选择视频中的某一帧作为 Live Photo 的封面": {},
"选择适合壁纸的比例,锁屏推荐使用「锁屏」或「全屏」": {},
"首次使用需下载 AI 模型(约 64MB": {}
"首次使用需下载 AI 模型(约 64MB": {},
"settings.languageChangeAlertTitle": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Language Changed"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "语言已更改"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "語言已更改"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "Idioma cambiado"
}
},
"ar": {
"stringUnit": {
"state": "translated",
"value": "تم تغيير اللغة"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "Langue modifiée"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "言語が変更されました"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "언어 변경됨"
}
}
}
},
"settings.languageChangeAlertMessage": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "The app needs to restart for the language change to take effect. Restart now?"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "需要重启应用以使语言更改生效。现在重启?"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "需要重啟應用程式以使語言更改生效。現在重啟?"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "La aplicación necesita reiniciarse para aplicar el cambio de idioma. ¿Reiniciar ahora?"
}
},
"ar": {
"stringUnit": {
"state": "translated",
"value": "يحتاج التطبيق إلى إعادة التشغيل لتطبيق تغيير اللغة. إعادة التشغيل الآن؟"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "L'application doit redémarrer pour appliquer le changement de langue. Redémarrer maintenant ?"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "言語変更を適用するにはアプリの再起動が必要です。今すぐ再起動しますか?"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "언어 변경을 적용하려면 앱을 다시 시작해야 합니다. 지금 다시 시작하시겠습니까?"
}
}
}
},
"settings.restartNow": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Restart Now"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "立即重启"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "立即重啟"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "Reiniciar ahora"
}
},
"ar": {
"stringUnit": {
"state": "translated",
"value": "إعادة التشغيل الآن"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "Redémarrer"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "今すぐ再起動"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "지금 다시 시작"
}
}
}
}
},
"version": "1.0"
}

View File

@@ -15,6 +15,8 @@ struct SettingsView: View {
@State private var showingClearRecentWorksAlert = false
@State private var feedbackPackageURL: URL?
@State private var showingShareSheet = false
@State private var showingLanguageChangeAlert = false
@State private var pendingLanguage: LanguageManager.Language?
var body: some View {
List {
@@ -43,7 +45,12 @@ struct SettingsView: View {
Section {
Picker(selection: Binding(
get: { LanguageManager.shared.current },
set: { LanguageManager.shared.current = $0 }
set: { newLanguage in
if newLanguage != LanguageManager.shared.current {
pendingLanguage = newLanguage
showingLanguageChangeAlert = true
}
}
)) {
ForEach(LanguageManager.Language.allCases) { language in
Text(language.displayName).tag(language)
@@ -151,6 +158,19 @@ struct SettingsView: View {
} message: {
Text(String(localized: "settings.clearRecordsConfirm"))
}
.alert(String(localized: "settings.languageChangeAlertTitle"), isPresented: $showingLanguageChangeAlert) {
Button(String(localized: "common.cancel"), role: .cancel) {
pendingLanguage = nil
}
Button(String(localized: "settings.restartNow"), role: .none) {
if let newLanguage = pendingLanguage {
LanguageManager.shared.current = newLanguage
}
exit(0)
}
} message: {
Text(String(localized: "settings.languageChangeAlertMessage"))
}
.sheet(isPresented: $showingShareSheet) {
if let url = feedbackPackageURL {
ShareSheet(activityItems: [url])