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
- Su
:post_created, discourse-ai mette in codaJobs::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. PostJobsEnqueuermette in coda:post_alertnello stesso momento.PostAlerter.push_notificationmette in coda immediatamenteJobs::DeliverPushNotification. Viene ritardato solo se il destinatario è stato visto entropush_notification_time_window_mins(predefinito 1), e in tal caso solo per il resto di quella finestra temporale.DeliverPushNotification#localize_content!cercaTopicLocalizationePostLocalizationperuser.effective_localeuna volta, quando il lavoro viene eseguito. Non trovandoli, invia il titolo e l’estratto originali. Non c’è attesa né nuovo tentativo.- Le email di notifica passano attraverso
NotificationEmailercon un ritardo diemail_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
- 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
DeliverPushNotificationuna volta dopo un breve ritardo e poi inviare ciò che è disponibile. Pochi secondi coprirebbero i casi misurati sopra. - 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 attraversoContentLocalization.show_translated_post?e confrontapost_version. Usare lo stesso percorso per le notifiche push le farebbe rispettareautomatically_translateeunderstood_languages, saltare le traduzioni obsolete e mantenere la coerenza con le email e la vista dell’argomento. - Applicare lo stesso alle notifiche live. Il payload pubblicato su
/notification-alert/:user_idinPostAlerter.create_notification_alertcontiene il titolo e l’estratto originali. Esiste il modificatorepost_alerter_live_notification_payload, ma il core non localizza il payload.