Localisation du contenu : les notifications push pour les nouveaux articles sont envoyées avant l'enregistrement de la traduction

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

  1. Sur :post_created, discourse-ai met en file Jobs::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.
  2. PostJobsEnqueuer met en file :post_alert au même moment. PostAlerter.push_notification met immédiatement en file Jobs::DeliverPushNotification. Elle est retardée uniquement si le destinataire a été vu dans push_notification_time_window_mins (par défaut 1), et alors seulement par le reste de cette fenêtre.
  3. DeliverPushNotification#localize_content! recherche TopicLocalization et PostLocalization pour user.effective_locale une 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.
  4. Les e-mails de notification passent par NotificationEmailer avec un délai de email_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

  1. 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 DeliverPushNotification une fois après un court délai, puis envoyer ce qui est disponible. Quelques secondes couvriraient les cas mesurés ci-dessus.
  2. 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 par ContentLocalization.show_translated_post? et compare post_version. Utiliser le même chemin pour la notification push permettrait de respecter automatically_translate et understood_languages, d’ignorer les traductions obsolètes et de rester cohérent avec les e-mails et la vue du sujet.
  3. Appliquer la même chose aux alertes en direct. La charge utile publiée sur /notification-alert/:user_id dans PostAlerter.create_notification_alert contient le titre et l’extrait originaux. Le modificateur post_alerter_live_notification_payload existe, mais le cœur du système ne localise pas la charge utile.

Liés

2 « J'aime »