Skip to content

Commit cd742b4

Browse files
authored
fix: translation settings (#152)
1 parent 5b00158 commit cd742b4

4 files changed

Lines changed: 48 additions & 20 deletions

File tree

Gem/Extensions/LanguageExtension.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ import Foundation
33
extension Locale.Language {
44
static let englishUS = Locale.Language(identifier: "en_US")
55
static let chinese = Locale.Language(identifier: "zh")
6+
static let spanish = Locale.Language(identifier: "es")
67
}

Gem/ViewModels/SettingsViewModel.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,16 @@ fileprivate extension String {
9191
translationConfig = config
9292
}
9393
}
94-
var translationTarget: Locale.Language = .init(languageCode: .spanish) {
94+
var translationTarget: Locale.Language? {
9595
didSet {
96-
UserDefaults.standard.setValue(translationTarget.languageCode?.identifier, forKey: .translationTargetKey)
97-
CommentTranslator.cache.removeAllObjects()
98-
let config = TranslationSession.Configuration(source: .englishUS, target: translationTarget)
99-
translationConfig = config
96+
if let translationTarget {
97+
UserDefaults.standard.setValue(translationTarget.languageCode?.identifier, forKey: .translationTargetKey)
98+
CommentTranslator.cache.removeAllObjects()
99+
let config = TranslationSession.Configuration(source: .englishUS, target: translationTarget)
100+
translationConfig = config
101+
} else {
102+
UserDefaults.standard.setValue(nil, forKey: .translationTargetKey)
103+
}
100104
}
101105
}
102106
var translationConfig: TranslationSession.Configuration?
@@ -133,7 +137,7 @@ fileprivate extension String {
133137
#if targetEnvironment(simulator)
134138
translationTarget = .init(languageCode: .chinese)
135139
#else
136-
translationTarget = targetLanguageIdentifier == nil ? .init(languageCode: .spanish) : .init(identifier: targetLanguageIdentifier!)
140+
translationTarget = targetLanguageIdentifier == nil ? nil : .init(identifier: targetLanguageIdentifier!)
137141
#endif
138142

139143
let downloadFrequencyRawValue = UserDefaults.standard.double(forKey: .downloadFrequencyKey)

Gem/ViewModels/ThreadViewModel.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,9 +395,11 @@ import Translation
395395
}
396396

397397
func translate() {
398-
guard item != nil && status.isCompleted else { return }
398+
guard item != nil && status.isCompleted,
399+
let targetLanguage = SettingsViewModel.shared.translationTarget
400+
else { return }
401+
self.targetLanguage = targetLanguage
399402
translationStatus = .inProgress
400-
targetLanguage = SettingsViewModel.shared.translationTarget
401403
guard let translator = CommentTranslator(targetLanguage: targetLanguage) else { return }
402404
factory = .init(processors: [
403405
translator,

Gem/Views/Settings.swift

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)