توطين المحتوى: تُرسل إشعارات الدفع للمشاركات الجديدة قبل حفظ الترجمة

ملخص

مع تمكين تهيئة المحتوى والترجمة بالذكاء الاصطناعي، فإن إشعار الدفع (Push Notification) الخاص بموضوع جديد يحمل في الغالب النص الأصلي للمؤلف، حتى عندما يقرأ المستلم لغة أخرى وتُخزَّن الترجمة بعد بضع ثوانٍ. يتم وضع الإشعار في قائمة الانتظار عند إنشاء الموضوع، ويقوم بالبحث عن الترجمة مرة واحدة فقط، قبل اكتمال مهمة الترجمة.

تم الإعلان اليوم عن رسائل البريد الإلكتروني المترجمة في هذا الرد (#44240). لا تتأثر رسائل البريد الإلكتروني بهذا التوقيت الزمني، بينما يتأثر إشعار الدفع، لذا بمجرد نشر ذلك التغيير، ستصل رسالة البريد الإلكتروني وإشعار الدفع للموضوع نفسه إلى نفس العضو بلغات مختلفة.

ما يراه العضو

عضو تكون لغة واجهته الإنجليزية يتلقى إشعار دفع، في المتصفح وعلى الجوال، لموضوع جديد مكتوب بالفرنسية. نص الإشعار يكون بالفرنسية. عند فتح الإشعار، يظهر الموضوع بالإنجليزية.

القياس

موقع على إصدار release/2026.7 (2026.7.3) مع إضافة discourse-ai المدمجة، واللغات المدعومة هي en وfr وde وit، والترجمة عبر gemini-3.8-flash وكشف اللغة عبر gemini-3.5-flash-lite.

بالنسبة لـ 11 موضوعًا مترجمًا، تم تخزين الترجمة الأولى بعد 2 إلى 3 ثوانٍ من إنشاء الموضوع، وآخر الترجمات الثلاث بعد 4 إلى 7 ثوانٍ. في الحالة المرصودة، تم تخزين الترجمة إلى لغة المستلم بعد ثانيتين من إنشاء الموضوع، بينما كان الإشعار قد أُرسل بالفعل بالنص الأصلي.

يمكن قراءة التأخير في أي موقع باستخدام الأمر التالي:

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

السبب

  1. عند حدث :post_created، يقوم discourse-ai بوضع Jobs::DetectTranslatePost في قائمة الانتظار (plugins/discourse-ai/lib/translation/entry_point.rb). تقوم المهمة بكشف اللغة عبر استدعاء نموذج واحد، ثم تترجم إلى كل لغة مدعومة أخرى بالتتابع.
  2. تقوم PostJobsEnqueuer بوضع :post_alert في قائمة الانتظار في نفس اللحظة. تقوم PostAlerter.push_notification بوضع Jobs::DeliverPushNotification في قائمة الانتظار فورًا. يتم تأجيلها فقط إذا شوهد المستلم ضمن push_notification_time_window_mins (الافتراضي 1)، وفي هذه الحالة فقط بقية تلك الفترة الزمنية.
  3. تبحث DeliverPushNotification#localize_content! عن TopicLocalization وPostLocalization الخاصة بـ user.effective_locale مرة واحدة، عند تشغيل المهمة. عند عدم إيجاد أي منها، ترسل العنوان والمقتطف الأصليين. لا يوجد انتظار أو إعادة محاولة.
  4. تمر رسائل البريد الإلكتروني الإشعارية عبر NotificationEmailer مع تأخير قدره email_time_window_mins (الافتراضي 10)، لذا تكون الترجمة موجودة بحلول الوقت الذي تُبنى فيه رسالة البريد الإلكتروني.

ملف app/jobs/regular/deliver_push_notification.rb متطابق في v2026.7.3 وفي فرع main عند b5548f76 (2026-10-05).

الطلب

  1. إيقاف إشعار الدفع للموضوع الجديد حتى يتم تخزين ترجمته. خيار واحد: عند تمكين تهيئة المحتوى ولم يكن للموضوع لغة مكتشفة بعد، أو لم توجد تهيئة للغة المستلم بينما يُتوقع وجودها، أعد وضع DeliverPushNotification في قائمة الانتظار مرة واحدة بعد تأخير قصير ثم أرسل ما هو متاح. بضع ثوانٍ ستغطي الحالات المقاسة أعلاه.
  2. اختيار المحتوى باستخدام القاعدة المشتركة. تقوم مهمة الدفع ببحثها الخاص عبر effective_locale. تغيير البريد الإلكتروني في #44240 يمر عبر ContentLocalization.show_translated_post? ويقارن post_version. استخدام المسار نفسه للدفع سيحترم automatically_translate وunderstood_languages، ويتخطى الترجمات القديمة، ويبقى متسقًا مع رسائل البريد الإلكتروني وعرض الموضوع.
  3. تطبيق نفس الشيء على التنبيهات المباشرة. الحمولة (Payload) المنشورة إلى /notification-alert/:user_id في PostAlerter.create_notification_alert تحمل العنوان والمقتطف الأصليين. يوجد معدّل (modifier) باسم post_alerter_live_notification_payload، لكن النواة (core) لا تهيئ الحمولة.

ذات صلة

إعجابَين (2)