Résumé
Avec la localisation du contenu et la traduction par IA activées, la notification push pour un nouveau message contient presque toujours le texte original de l’auteur, même si le destinataire lit dans une autre langue et qu’une traduction est stockée quelques secondes plus tard. La notification est mise en file d’attente lors de la création du message et recherche une traduction une seule fois, avant que la tâche de traduction ne soit terminée.
Les e-mails traduits ont été annoncés aujourd’hui dans cette réponse (#44240). Les e-mails ne sont pas exposés à ce problème de synchronisation, contrairement aux notifications push, de sorte qu’une fois ce changement déployé, l’e-mail et la notification push pour le même message atteindront le même membre dans des langues différentes.
Ce que voit un membre
Un membre dont la langue de l’interface est l’anglais reçoit une notification push, dans le navigateur et sur mobile, pour un nouveau sujet rédigé en français. Le corps de la notification est en français. L’ouverture de la notification affiche le message en anglais.
Mesure
Site sur release/2026.7 (2026.7.3) avec le plugin discourse-ai intégré, localisations prises en charge en, fr, de et it, traduction sur gemini-3.8-flash et détection de langue sur gemini-3.5-flash-lite.
Pour 11 messages traduits, la première traduction a été stockée 2 à 3 secondes après la création du message, et la dernière des trois 4 à 7 secondes après. Dans le cas observé, la traduction vers la langue du destinataire a été stockée 2 secondes après le message, et la notification push avait déjà été envoyée avec le texte original.
Le délai peut être lu sur n’importe quel site avec :
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
Cause
- Sur
:post_created, discourse-ai met en fileJobs::DetectTranslatePost(plugins/discourse-ai/lib/translation/entry_point.rb). La tâche détecte la langue avec un appel au modèle, puis traduit dans chaque autre localisation prise en charge à son tour. PostJobsEnqueuermet en file:post_alertau même moment.PostAlerter.push_notificationmet immédiatement en fileJobs::DeliverPushNotification. Elle est retardée uniquement si le destinataire a été vu danspush_notification_time_window_mins(par défaut 1), et alors seulement par le reste de cette fenêtre.DeliverPushNotification#localize_content!rechercheTopicLocalizationetPostLocalizationpouruser.effective_localeune seule fois, lorsque la tâche s’exécute. Ne trouvant rien, elle envoie le titre et l’extrait originaux. Rien n’attend ni ne retente.- Les e-mails de notification passent par
NotificationEmaileravec un délai deemail_time_window_mins(par défaut 10), de sorte que la traduction existe au moment où l’e-mail est construit.
app/jobs/regular/deliver_push_notification.rb est identique sur v2026.7.3 et sur main à b5548f76 (2026-10-05).
Demande
- Retenir la notification push pour un nouveau message jusqu’à ce que sa traduction soit stockée. Une option : lorsque la localisation du contenu est activée et que le message n’a pas encore de localisation détectée, ou qu’il n’y a pas de localisation pour la localisation du destinataire alors qu’une est attendue, remettre en file
DeliverPushNotificationune fois après un court délai, puis envoyer ce qui est disponible. Quelques secondes couvriraient les cas mesurés ci-dessus. - Sélectionner le contenu avec la règle partagée. La tâche push effectue sa propre recherche par
effective_locale. La modification des e-mails dans #44240 passe parContentLocalization.show_translated_post?et comparepost_version. Utiliser le même chemin pour la notification push permettrait de respecterautomatically_translateetunderstood_languages, d’ignorer les traductions obsolètes et de rester cohérent avec les e-mails et la vue du sujet. - Appliquer la même chose aux alertes en direct. La charge utile publiée sur
/notification-alert/:user_iddansPostAlerter.create_notification_alertcontient le titre et l’extrait originaux. Le modificateurpost_alerter_live_notification_payloadexiste, mais le cœur du système ne localise pas la charge utile.