ملخص
مع تمكين تهيئة المحتوى والترجمة بالذكاء الاصطناعي، فإن إشعار الدفع (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
السبب
- عند حدث
:post_created، يقوم discourse-ai بوضعJobs::DetectTranslatePostفي قائمة الانتظار (plugins/discourse-ai/lib/translation/entry_point.rb). تقوم المهمة بكشف اللغة عبر استدعاء نموذج واحد، ثم تترجم إلى كل لغة مدعومة أخرى بالتتابع. - تقوم
PostJobsEnqueuerبوضع:post_alertفي قائمة الانتظار في نفس اللحظة. تقومPostAlerter.push_notificationبوضعJobs::DeliverPushNotificationفي قائمة الانتظار فورًا. يتم تأجيلها فقط إذا شوهد المستلم ضمنpush_notification_time_window_mins(الافتراضي 1)، وفي هذه الحالة فقط بقية تلك الفترة الزمنية. - تبحث
DeliverPushNotification#localize_content!عنTopicLocalizationوPostLocalizationالخاصة بـuser.effective_localeمرة واحدة، عند تشغيل المهمة. عند عدم إيجاد أي منها، ترسل العنوان والمقتطف الأصليين. لا يوجد انتظار أو إعادة محاولة. - تمر رسائل البريد الإلكتروني الإشعارية عبر
NotificationEmailerمع تأخير قدرهemail_time_window_mins(الافتراضي 10)، لذا تكون الترجمة موجودة بحلول الوقت الذي تُبنى فيه رسالة البريد الإلكتروني.
ملف app/jobs/regular/deliver_push_notification.rb متطابق في v2026.7.3 وفي فرع main عند b5548f76 (2026-10-05).
الطلب
- إيقاف إشعار الدفع للموضوع الجديد حتى يتم تخزين ترجمته. خيار واحد: عند تمكين تهيئة المحتوى ولم يكن للموضوع لغة مكتشفة بعد، أو لم توجد تهيئة للغة المستلم بينما يُتوقع وجودها، أعد وضع
DeliverPushNotificationفي قائمة الانتظار مرة واحدة بعد تأخير قصير ثم أرسل ما هو متاح. بضع ثوانٍ ستغطي الحالات المقاسة أعلاه. - اختيار المحتوى باستخدام القاعدة المشتركة. تقوم مهمة الدفع ببحثها الخاص عبر
effective_locale. تغيير البريد الإلكتروني في #44240 يمر عبرContentLocalization.show_translated_post?ويقارنpost_version. استخدام المسار نفسه للدفع سيحترمautomatically_translateوunderstood_languages، ويتخطى الترجمات القديمة، ويبقى متسقًا مع رسائل البريد الإلكتروني وعرض الموضوع. - تطبيق نفس الشيء على التنبيهات المباشرة. الحمولة (Payload) المنشورة إلى
/notification-alert/:user_idفيPostAlerter.create_notification_alertتحمل العنوان والمقتطف الأصليين. يوجد معدّل (modifier) باسمpost_alerter_live_notification_payload، لكن النواة (core) لا تهيئ الحمولة.