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:
@@ -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"
|
||||
}
|
||||
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user