Add auto-translate setting
This commit is contained in:
@@ -18,6 +18,8 @@ struct TranslateView: View {
|
|||||||
@State var translated_note: String? = nil
|
@State var translated_note: String? = nil
|
||||||
@State var show_translated_note: Bool = false
|
@State var show_translated_note: Bool = false
|
||||||
@State var translated_artifacts: NoteArtifacts? = nil
|
@State var translated_artifacts: NoteArtifacts? = nil
|
||||||
|
|
||||||
|
let preferredLanguages = Set(Locale.preferredLanguages.map { localeToLanguage($0) })
|
||||||
|
|
||||||
var TranslateButton: some View {
|
var TranslateButton: some View {
|
||||||
Button(NSLocalizedString("Translate Note", comment: "Button to translate note from different language.")) {
|
Button(NSLocalizedString("Translate Note", comment: "Button to translate note from different language.")) {
|
||||||
@@ -89,9 +91,9 @@ struct TranslateView: View {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if note_lang != currentLanguage {
|
if !preferredLanguages.contains(note_lang) {
|
||||||
do {
|
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 translator = Translator(damus_state.settings)
|
||||||
let originalContent = event.get_content(damus_state.keypair.privkey)
|
let originalContent = event.get_content(damus_state.keypair.privkey)
|
||||||
translated_note = try await translator.translate(originalContent, from: note_lang, to: currentLanguage)
|
translated_note = try await translator.translate(originalContent, from: note_lang, to: currentLanguage)
|
||||||
@@ -115,11 +117,21 @@ struct TranslateView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkingTranslationStatus = false
|
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 {
|
struct TranslateView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let ds = test_damus_state()
|
let ds = test_damus_state()
|
||||||
|
|||||||
@@ -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 {
|
@Published var show_only_preferred_languages: Bool {
|
||||||
didSet {
|
didSet {
|
||||||
UserDefaults.standard.set(show_only_preferred_languages, forKey: "show_only_preferred_languages")
|
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
|
left_handed = UserDefaults.standard.object(forKey: "left_handed") as? Bool ?? false
|
||||||
zap_vibration = UserDefaults.standard.object(forKey: "zap_vibration") as? Bool ?? false
|
zap_vibration = UserDefaults.standard.object(forKey: "zap_vibration") as? Bool ?? false
|
||||||
disable_animation = should_disable_image_animation()
|
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
|
show_only_preferred_languages = UserDefaults.standard.object(forKey: "show_only_preferred_languages") as? Bool ?? false
|
||||||
|
|
||||||
// Note from @tyiu:
|
// Note from @tyiu:
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ struct ConfigView: View {
|
|||||||
Section(NSLocalizedString("Translations", comment: "Section title for selecting the translation service.")) {
|
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)
|
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)
|
.toggleStyle(.switch)
|
||||||
|
|
||||||
Picker(NSLocalizedString("Service", comment: "Prompt selection of translation service provider."), selection: $settings.translation_service) {
|
Picker(NSLocalizedString("Service", comment: "Prompt selection of translation service provider."), selection: $settings.translation_service) {
|
||||||
ForEach(TranslationService.allCases, id: \.self) { server in
|
ForEach(TranslationService.allCases, id: \.self) { server in
|
||||||
Text(server.model.displayName)
|
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")!)
|
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")) {
|
Section(NSLocalizedString("Miscellaneous", comment: "Section header for miscellaneous user configuration")) {
|
||||||
|
|||||||
@@ -61,6 +61,10 @@ struct NoteContentView: View {
|
|||||||
var invoicesView: some View {
|
var invoicesView: some View {
|
||||||
InvoicesView(our_pubkey: damus_state.keypair.pubkey, invoices: artifacts.invoices)
|
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 {
|
var previewView: some View {
|
||||||
Group {
|
Group {
|
||||||
@@ -82,7 +86,6 @@ struct NoteContentView: View {
|
|||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
if size == .selected {
|
if size == .selected {
|
||||||
SelectableText(attributedString: artifacts.content)
|
SelectableText(attributedString: artifacts.content)
|
||||||
TranslateView(damus_state: damus_state, event: event)
|
|
||||||
} else {
|
} else {
|
||||||
if with_padding {
|
if with_padding {
|
||||||
truncatedText
|
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 {
|
if show_images && artifacts.images.count > 0 {
|
||||||
ImageCarousel(urls: artifacts.images)
|
ImageCarousel(urls: artifacts.images)
|
||||||
} else if !show_images && artifacts.images.count > 0 {
|
} 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 {
|
struct NoteArtifacts {
|
||||||
let content: AttributedString
|
let content: AttributedString
|
||||||
let images: [URL]
|
let images: [URL]
|
||||||
|
|||||||
Reference in New Issue
Block a user