@@ -7,6 +7,9 @@ struct Settings: View {
77 @Bindable var vm = SettingsViewModel . shared
88 @State var url : IdentifiableURL ?
99 @State var isLogsPresented : Bool = false
10+ @State var isTranslationEnabledBuffer : Bool = false
11+ @State var targetLanguageBuffer : Locale . Language
12+ @State var translationConfigBuffer : TranslationSession . Configuration ?
1013
1114 private let githubRepoUrl = URL ( string: " https://github.com/Livinglist/Gem " ) !
1215 private let githubIssuesUrl = URL ( string: " https://github.com/Livinglist/Gem/issues " ) !
@@ -18,6 +21,13 @@ struct Settings: View {
1821 return " Version \( version) ( \( build) ) "
1922 }
2023
24+ init ( ) {
25+ let vm = SettingsViewModel . shared
26+ self . isTranslationEnabledBuffer = vm. isTranslationEnabled
27+ self . targetLanguageBuffer = vm. translationTarget ?? . spanish
28+ self . translationConfigBuffer = vm. translationConfig
29+ }
30+
2131 var body : some View {
2232 List {
2333 Section {
@@ -52,17 +62,17 @@ struct Settings: View {
5262 }
5363
5464 Section {
55- Toggle ( isOn: $vm . isTranslationEnabled ) {
65+ Toggle ( isOn: $isTranslationEnabledBuffer ) {
5666 Text ( " Translation " )
5767 }
5868 . tint ( . accent)
59- Picker ( " Target Language " , selection: $vm . translationTarget ) {
69+ Picker ( " Target Language " , selection: $targetLanguageBuffer ) {
6070 ForEach ( vm. supportedLanguages, id: \. self) { language in
6171 Text ( Locale . current. localizedString ( forLanguageCode: language. languageCode? . identifier ?? " " ) ?? " Unknown " )
6272 . tag ( language)
6373 }
6474 }
65- . disabled ( !vm . isTranslationEnabled )
75+ . disabled ( !isTranslationEnabledBuffer )
6676 . pickerStyle ( . menu)
6777 . tint ( . accent)
6878 }
@@ -149,18 +159,29 @@ struct Settings: View {
149159 }
150160 . navigationBarTitleDisplayMode ( . inline)
151161 . navigationTitle ( " Settings " )
152- . translationTask ( vm. translationConfig) { session in
153- Task { @MainActor in
154- if vm. isTranslationEnabled {
155- try ? await session. prepareTranslation ( )
156- if await !session. isReady {
157- vm. translationTarget = . init( languageCode: . spanish)
158- vm. isTranslationEnabled = false
159- }
162+ . onChange ( of: targetLanguageBuffer) {
163+ translationConfigBuffer = TranslationSession . Configuration ( source: . englishUS, target: targetLanguageBuffer)
164+ }
165+ . onChange ( of: isTranslationEnabledBuffer) {
166+ if isTranslationEnabledBuffer {
167+ translationConfigBuffer = TranslationSession . Configuration ( source: . englishUS, target: targetLanguageBuffer)
168+ } else {
169+ vm. isTranslationEnabled = false
170+ }
171+ }
172+ . translationTask ( translationConfigBuffer) { session in
173+ if isTranslationEnabledBuffer {
174+ try ? await session. prepareTranslation ( )
175+ if await session. isReady {
176+ vm. translationTarget = targetLanguageBuffer
177+ vm. isTranslationEnabled = isTranslationEnabledBuffer
178+ } else {
179+ isTranslationEnabledBuffer = vm. isTranslationEnabled
180+ targetLanguageBuffer = vm. translationTarget ?? . spanish
160181 }
161182 }
162183 }
163184 . sensoryFeedback ( . impact( weight: . heavy) , trigger: vm. isDevModeEnabled)
164- . sensoryFeedback ( . selection, trigger: vm . translationTarget )
185+ . sensoryFeedback ( . selection, trigger: targetLanguageBuffer )
165186 }
166187}
0 commit comments