@@ -280,6 +280,11 @@ func can_and_should_translate(event: NostrEvent, our_keypair: Keypair, settings:
280280}
281281
282282func 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-
0 commit comments