From 866e93d338e9ecc2dbc70edca7f1e1d6eff8818b Mon Sep 17 00:00:00 2001 From: Terry Yiu <963907+tyiu@users.noreply.github.com> Date: Sun, 26 Mar 2023 11:50:41 -0600 Subject: [PATCH] Add auto-translate setting --- damus/Components/TranslateView.swift | 18 +++++++++++++++--- damus/Models/UserSettingsStore.swift | 7 +++++++ damus/Views/ConfigView.swift | 6 ++++++ damus/Views/NoteContentView.swift | 24 +++++++++++++----------- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/damus/Components/TranslateView.swift b/damus/Components/TranslateView.swift index 89681557..c003caa5 100644 --- a/damus/Components/TranslateView.swift +++ b/damus/Components/TranslateView.swift @@ -18,6 +18,8 @@ struct TranslateView: View { @State var translated_note: String? = nil @State var show_translated_note: Bool = false @State var translated_artifacts: NoteArtifacts? = nil + + let preferredLanguages = Set(Locale.preferredLanguages.map { localeToLanguage($0) }) var TranslateButton: some View { Button(NSLocalizedString("Translate Note", comment: "Button to translate note from different language.")) { @@ -89,9 +91,9 @@ struct TranslateView: View { return } - if note_lang != currentLanguage { + if !preferredLanguages.contains(note_lang) { do { - // If the note language is different from our language, send a translation request. + // If the note language is different from our preferred languages, send a translation request. let translator = Translator(damus_state.settings) let originalContent = event.get_content(damus_state.keypair.privkey) translated_note = try await translator.translate(originalContent, from: note_lang, to: currentLanguage) @@ -115,11 +117,21 @@ struct TranslateView: View { } checkingTranslationStatus = false - + + show_translated_note = damus_state.settings.auto_translate } } } +extension View { + func translate_button_style() -> some View { + return self + .font(.footnote) + .contentShape(Rectangle()) + .padding([.top, .bottom], 10) + } +} + struct TranslateView_Previews: PreviewProvider { static var previews: some View { let ds = test_damus_state() diff --git a/damus/Models/UserSettingsStore.swift b/damus/Models/UserSettingsStore.swift index d2ca2ece..4f53d394 100644 --- a/damus/Models/UserSettingsStore.swift +++ b/damus/Models/UserSettingsStore.swift @@ -128,6 +128,12 @@ class UserSettingsStore: ObservableObject { } } + @Published var auto_translate: Bool { + didSet { + UserDefaults.standard.set(auto_translate, forKey: "auto_translate") + } + } + @Published var show_only_preferred_languages: Bool { didSet { UserDefaults.standard.set(show_only_preferred_languages, forKey: "show_only_preferred_languages") @@ -216,6 +222,7 @@ class UserSettingsStore: ObservableObject { left_handed = UserDefaults.standard.object(forKey: "left_handed") as? Bool ?? false zap_vibration = UserDefaults.standard.object(forKey: "zap_vibration") as? Bool ?? false disable_animation = should_disable_image_animation() + auto_translate = UserDefaults.standard.object(forKey: "auto_translate") as? Bool ?? false show_only_preferred_languages = UserDefaults.standard.object(forKey: "show_only_preferred_languages") as? Bool ?? false // Note from @tyiu: diff --git a/damus/Views/ConfigView.swift b/damus/Views/ConfigView.swift index 0eea0c44..418bd479 100644 --- a/damus/Views/ConfigView.swift +++ b/damus/Views/ConfigView.swift @@ -155,6 +155,7 @@ struct ConfigView: View { Section(NSLocalizedString("Translations", comment: "Section title for selecting the translation service.")) { Toggle(NSLocalizedString("Show only preferred languages on Universe feed", comment: "Toggle to show notes that are only in the device's preferred languages on the Universe feed and hide notes that are in other languages."), isOn: $settings.show_only_preferred_languages) .toggleStyle(.switch) + Picker(NSLocalizedString("Service", comment: "Prompt selection of translation service provider."), selection: $settings.translation_service) { ForEach(TranslationService.allCases, id: \.self) { server in Text(server.model.displayName) @@ -199,6 +200,11 @@ struct ConfigView: View { Link(NSLocalizedString("Get API Key", comment: "Button to navigate to DeepL website to get a translation API key."), destination: URL(string: "https://www.deepl.com/pro-api")!) } } + + if settings.translation_service != .none { + Toggle(NSLocalizedString("Automatically translate notes", comment: "Toggle to automatically translate notes."), isOn: $settings.auto_translate) + .toggleStyle(.switch) + } } Section(NSLocalizedString("Miscellaneous", comment: "Section header for miscellaneous user configuration")) { diff --git a/damus/Views/NoteContentView.swift b/damus/Views/NoteContentView.swift index 9df57e0b..89b763fc 100644 --- a/damus/Views/NoteContentView.swift +++ b/damus/Views/NoteContentView.swift @@ -61,6 +61,10 @@ struct NoteContentView: View { var invoicesView: some View { InvoicesView(our_pubkey: damus_state.keypair.pubkey, invoices: artifacts.invoices) } + + var translateView: some View { + TranslateView(damus_state: damus_state, event: event) + } var previewView: some View { Group { @@ -82,7 +86,6 @@ struct NoteContentView: View { VStack(alignment: .leading) { if size == .selected { SelectableText(attributedString: artifacts.content) - TranslateView(damus_state: damus_state, event: event) } else { if with_padding { truncatedText @@ -92,6 +95,15 @@ struct NoteContentView: View { } } + if size == .selected || damus_state.settings.auto_translate { + if with_padding { + translateView + .padding(.horizontal) + } else { + translateView + } + } + if show_images && artifacts.images.count > 0 { ImageCarousel(urls: artifacts.images) } else if !show_images && artifacts.images.count > 0 { @@ -217,16 +229,6 @@ struct NoteContentView_Previews: PreviewProvider { } } - -extension View { - func translate_button_style() -> some View { - return self - .font(.footnote) - .contentShape(Rectangle()) - .padding([.top, .bottom], 10) - } -} - struct NoteArtifacts { let content: AttributedString let images: [URL]