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 的封面": {},
|
"选择视频中的某一帧作为 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"
|
"version": "1.0"
|
||||||
}
|
}
|
||||||
@@ -15,6 +15,8 @@ struct SettingsView: View {
|
|||||||
@State private var showingClearRecentWorksAlert = false
|
@State private var showingClearRecentWorksAlert = false
|
||||||
@State private var feedbackPackageURL: URL?
|
@State private var feedbackPackageURL: URL?
|
||||||
@State private var showingShareSheet = false
|
@State private var showingShareSheet = false
|
||||||
|
@State private var showingLanguageChangeAlert = false
|
||||||
|
@State private var pendingLanguage: LanguageManager.Language?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
List {
|
List {
|
||||||
@@ -43,7 +45,12 @@ struct SettingsView: View {
|
|||||||
Section {
|
Section {
|
||||||
Picker(selection: Binding(
|
Picker(selection: Binding(
|
||||||
get: { LanguageManager.shared.current },
|
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
|
ForEach(LanguageManager.Language.allCases) { language in
|
||||||
Text(language.displayName).tag(language)
|
Text(language.displayName).tag(language)
|
||||||
@@ -151,6 +158,19 @@ struct SettingsView: View {
|
|||||||
} message: {
|
} message: {
|
||||||
Text(String(localized: "settings.clearRecordsConfirm"))
|
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) {
|
.sheet(isPresented: $showingShareSheet) {
|
||||||
if let url = feedbackPackageURL {
|
if let url = feedbackPackageURL {
|
||||||
ShareSheet(activityItems: [url])
|
ShareSheet(activityItems: [url])
|
||||||
|
|||||||
Reference in New Issue
Block a user