Localizzazione dei contenuti: le notifiche push per i nuovi post vengono inviate prima che la traduzione venga salvata

Riepilogo

Con la localizzazione dei contenuti e la traduzione AI abilitate, la notifica push per un nuovo post contiene quasi sempre il testo originale dell’autore, anche quando il destinatario legge in un’altra lingua e una traduzione viene salvata pochi secondi dopo. La notifica viene messa in coda quando il post viene creato e cerca una traduzione una sola volta, prima che il lavoro di traduzione sia completato.

Le email tradotte sono state annunciate oggi in questa risposta (#44240). Le email non sono soggette a questo problema di tempistica, mentre le notifiche push lo sono, quindi una volta implementata quella modifica, l’email e la notifica push per lo stesso post raggiungeranno lo stesso membro in lingue diverse.

Cosa vede un membro

Un membro la cui lingua dell’interfaccia è l’inglese riceve una notifica push, sia nel browser che su mobile, per un nuovo argomento scritto in francese. Il corpo della notifica è in francese. Aprendo la notifica, il post viene mostrato in inglese.

Misurazione

Sito su release/2026.7 (2026.7.3) con il plugin discourse-ai incluso, locale supportati en, fr, de e it, traduzione su gemini-3.8-flash e rilevamento della lingua su gemini-3.5-flash-lite.

Per 11 post tradotti, la prima traduzione è stata salvata 2 o 3 secondi dopo la creazione del post, e l’ultima delle tre 4 o 7 secondi dopo. Nel caso osservato, la traduzione nella lingua del destinatario è stata salvata 2 secondi dopo il post, e la notifica push era già stata inviata con il testo originale.

Il ritardo può essere letto su qualsiasi sito con:

SELECT p.id,
       p.locale AS post_locale,
       pl.locale AS translation_locale,
       ROUND(EXTRACT(EPOCH FROM (pl.created_at - p.created_at))) AS seconds_after_post
FROM posts p
JOIN post_localizations pl ON pl.post_id = p.id
WHERE p.created_at > NOW() - INTERVAL '2 days'
ORDER BY p.id, pl.created_at

Causa

  1. Su :post_created, discourse-ai mette in coda Jobs::DetectTranslatePost (plugins/discourse-ai/lib/translation/entry_point.rb). Il lavoro rileva la lingua con una chiamata al modello e poi traduce in ciascuno degli altri locale supportati a turno.
  2. PostJobsEnqueuer mette in coda :post_alert nello stesso momento. PostAlerter.push_notification mette in coda immediatamente Jobs::DeliverPushNotification. Viene ritardato solo se il destinatario è stato visto entro push_notification_time_window_mins (predefinito 1), e in tal caso solo per il resto di quella finestra temporale.
  3. DeliverPushNotification#localize_content! cerca TopicLocalization e PostLocalization per user.effective_locale una volta, quando il lavoro viene eseguito. Non trovandoli, invia il titolo e l’estratto originali. Non c’è attesa né nuovo tentativo.
  4. Le email di notifica passano attraverso NotificationEmailer con un ritardo di email_time_window_mins (predefinito 10), quindi la traduzione esiste già al momento in cui l’email viene creata.

app/jobs/regular/deliver_push_notification.rb è identico in v2026.7.3 e su main in b5548f76 (2026-10-05).

Richiesta

  1. Mettere in attesa la notifica push per un nuovo post finché la sua traduzione non viene salvata. Un’opzione: quando la localizzazione dei contenuti è abilitata e il post non ha ancora un locale rilevato, o non ha una localizzazione per il locale del destinatario se ne è prevista una, rimettere in coda DeliverPushNotification una volta dopo un breve ritardo e poi inviare ciò che è disponibile. Pochi secondi coprirebbero i casi misurati sopra.
  2. Selezionare il contenuto con la regola condivisa. Il lavoro di notifica push esegue la propria ricerca tramite effective_locale. La modifica alle email in #44240 passa attraverso ContentLocalization.show_translated_post? e confronta post_version. Usare lo stesso percorso per le notifiche push le farebbe rispettare automatically_translate e understood_languages, saltare le traduzioni obsolete e mantenere la coerenza con le email e la vista dell’argomento.
  3. Applicare lo stesso alle notifiche live. Il payload pubblicato su /notification-alert/:user_id in PostAlerter.create_notification_alert contiene il titolo e l’estratto originali. Esiste il modificatore post_alerter_live_notification_payload, ma il core non localizza il payload.

Correlati

2 Mi Piace