Skip to content

Commit 5058fb3

Browse files
alltheseasdanieldaquino
authored andcommitted
Restore translated note rendering
Changelog-Fixed: Fixed broken automatic translations Closes: #3406 Signed-off-by: alltheseas <[email protected]>
1 parent 48143f8 commit 5058fb3

File tree

4 files changed

+56
-23
lines changed

4 files changed

+56
-23
lines changed

damus/Features/Events/NoteContentView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ struct NoteContentView: View {
307307
}
308308

309309
// always reload artifacts on load
310-
let plan = get_preload_plan(evcache: damus_state.events, ev: event, our_keypair: damus_state.keypair, settings: damus_state.settings)
310+
let plan = get_preload_plan(ndb: damus_state.ndb, evcache: damus_state.events, ev: event, our_keypair: damus_state.keypair, settings: damus_state.settings)
311311

312312
// TODO: make this cleaner
313313
Task {

damus/Features/Translations/Views/TranslateView.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,15 @@ func translate_note(profiles: Profiles, keypair: Keypair, event: NostrEvent, set
158158
return .not_needed
159159
}
160160

161-
// Render translated note
162-
// TODO: fix translated blocks
163-
//let translated_blocks = parse_note_content(content: .content(translated_note, event.tags))
164-
//let artifacts = render_blocks(blocks: translated_blocks, profiles: profiles, can_hide_last_previewable_refs: true)
161+
// Render translated note using the same NostrDB block parser so links/mentions/media stay consistent.
162+
let artifacts: NoteArtifactsSeparated
163+
if let translated_blocks = try? NdbBlockGroup.parse(content: translated_note) {
164+
artifacts = render_blocks(blocks: translated_blocks, profiles: profiles, can_hide_last_previewable_refs: true)
165+
} else {
166+
artifacts = .just_content(translated_note)
167+
}
165168

166-
return .not_needed
167-
168-
// and cache it
169-
//return .translated(Translated(artifacts: artifacts, language: note_lang))
169+
return .translated(Translated(artifacts: artifacts, language: note_lang))
170170
}
171171

172172
func current_language() -> String {

damus/Shared/Utilities/EventCache.swift

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ func can_and_should_translate(event: NostrEvent, our_keypair: Keypair, settings:
280280
}
281281

282282
func should_preload_translation(event: NostrEvent, our_keypair: Keypair, current_status: TranslateStatus, settings: UserSettingsStore, note_lang: String?) -> Bool {
283+
guard let note_lang else {
284+
// Without a detected language we can't safely auto-translate.
285+
return false
286+
}
287+
283288
switch current_status {
284289
case .havent_tried:
285290
return can_and_should_translate(event: event, our_keypair: our_keypair, settings: settings, note_lang: note_lang) && settings.auto_translate
@@ -306,15 +311,24 @@ func load_preview(artifacts: NoteArtifactsSeparated) async -> Preview? {
306311
return Preview(meta: meta)
307312
}
308313

309-
func get_preload_plan(evcache: EventCache, ev: NostrEvent, our_keypair: Keypair, settings: UserSettingsStore) -> PreloadPlan? {
314+
@MainActor
315+
private func compute_note_language(ndb: Ndb, ev: NostrEvent, keypair: Keypair) -> String? {
316+
return ev.note_language(ndb: ndb, keypair)
317+
}
318+
319+
@MainActor
320+
func get_preload_plan(ndb: Ndb, evcache: EventCache, ev: NostrEvent, our_keypair: Keypair, settings: UserSettingsStore) -> PreloadPlan? {
310321
let cache = evcache.get_cache_data(ev.id)
311322
let load_artifacts = cache.artifacts.should_preload
312323
if load_artifacts {
313324
cache.artifacts_model.state = .loading
314325
}
315326

316327
// Cached event might not have the note language determined yet, so determine the language here before figuring out if translations should be preloaded.
317-
let note_lang = cache.translations_model.note_language ?? /*ev.note_language(our_keypair.privkey)*/ current_language()
328+
let note_lang = cache.translations_model.note_language ?? compute_note_language(ndb: ndb, ev: ev, keypair: our_keypair)
329+
if cache.translations_model.note_language == nil {
330+
cache.translations_model.note_language = note_lang
331+
}
318332

319333
let load_translations = should_preload_translation(event: ev, our_keypair: our_keypair, current_status: cache.translations, settings: settings, note_lang: note_lang)
320334
if load_translations {
@@ -418,11 +432,19 @@ func preload_event(plan: PreloadPlan, state: DamusState) async {
418432
}
419433
}
420434

421-
let note_language = plan.data.translations_model.note_language ?? plan.event.note_language(ndb: state.ndb, our_keypair) ?? current_language()
435+
let note_language: String?
436+
if let cached_language = plan.data.translations_model.note_language {
437+
note_language = cached_language
438+
} else {
439+
note_language = await compute_note_language(ndb: state.ndb, ev: plan.event, keypair: our_keypair)
440+
}
422441

423442
var translations: TranslateStatus? = nil
424443
// We have to recheck should_translate here now that we have note_language
425-
if plan.load_translations && can_and_should_translate(event: plan.event, our_keypair: our_keypair, settings: settings, note_lang: note_language) && settings.auto_translate
444+
if plan.load_translations,
445+
let note_language,
446+
can_and_should_translate(event: plan.event, our_keypair: our_keypair, settings: settings, note_lang: note_language),
447+
settings.auto_translate
426448
{
427449
translations = await translate_note(profiles: profiles, keypair: our_keypair, event: plan.event, settings: settings, note_lang: note_language, purple: state.purple)
428450
}
@@ -446,18 +468,29 @@ func preload_events(state: DamusState, events: [NostrEvent]) {
446468
let our_keypair = state.keypair
447469
let settings = state.settings
448470

449-
let plans = events.compactMap { ev in
450-
get_preload_plan(evcache: event_cache, ev: ev, our_keypair: our_keypair, settings: settings)
451-
}
452-
453-
if plans.count == 0 {
454-
return
455-
}
456-
457471
Task {
472+
let plans = await withTaskGroup(of: PreloadPlan?.self) { group in
473+
for ev in events {
474+
group.addTask {
475+
await get_preload_plan(ndb: state.ndb, evcache: event_cache, ev: ev, our_keypair: our_keypair, settings: settings)
476+
}
477+
}
478+
479+
var results: [PreloadPlan] = []
480+
for await plan in group {
481+
if let plan {
482+
results.append(plan)
483+
}
484+
}
485+
return results
486+
}
487+
488+
if plans.count == 0 {
489+
return
490+
}
491+
458492
for plan in plans {
459493
await preload_event(plan: plan, state: state)
460494
}
461495
}
462496
}
463-

nostrdb/NdbNote.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,8 @@ extension NdbNote {
556556
return thread_reply() != nil
557557
}
558558

559+
@MainActor
559560
func note_language(ndb: Ndb, _ keypair: Keypair) -> String? {
560-
assert(!Thread.isMainThread, "This function must not be run on the main thread.")
561561

562562
// Rely on Apple's NLLanguageRecognizer to tell us which language it thinks the note is in
563563
// and filter on only the text portions of the content as URLs and hashtags confuse the language recognizer.

0 commit comments

Comments
 (0)