Merge remote-tracking branch 'terry/tyiu/filter-language'

Changelog-Added: Auto Translation
This commit is contained in:
2023-03-27 10:43:17 -04:00
committed by William Casarin
7 changed files with 107 additions and 37 deletions

View File

@@ -153,6 +153,9 @@ 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)
@@ -197,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")) {

View File

@@ -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]

View File

@@ -7,12 +7,15 @@
import SwiftUI
import CryptoKit
import NaturalLanguage
struct SearchHomeView: View {
let damus_state: DamusState
@StateObject var model: SearchHomeModel
@State var search: String = ""
@FocusState private var isFocused: Bool
let preferredLanguages = Set(Locale.preferredLanguages.map { localeToLanguage($0) })
var SearchInput: some View {
HStack {
@@ -41,12 +44,29 @@ struct SearchHomeView: View {
}
var GlobalContent: some View {
return TimelineView(events: model.events, loading: $model.loading, damus: damus_state, show_friend_icon: true, filter: { _ in true })
.refreshable {
// Fetch new information by unsubscribing and resubscribing to the relay
model.unsubscribe()
model.subscribe()
return TimelineView(
events: model.events,
loading: $model.loading,
damus: damus_state,
show_friend_icon: true,
filter: {
if damus_state.settings.show_only_preferred_languages == false {
return true
}
// If we can't determine the note's language with 50%+ confidence, lean on the side of caution and show it anyway.
guard let noteLanguage = $0.note_language(damus_state.keypair.privkey) else {
return true
}
return preferredLanguages.contains(noteLanguage)
}
)
.refreshable {
// Fetch new information by unsubscribing and resubscribing to the relay
model.unsubscribe()
model.subscribe()
}
}
var SearchContent: some View {