콘텐츠 로컬라이제이션: 새 게시물 푸시 알림이 번역이 저장되기 전에 전송됩니다

요약

콘텐츠 로컬라이제이션과 AI 번역이 활성화된 경우, 수신자가 다른 언어를 읽고 번역본이 몇 초 후 저장되더라도 새 게시글에 대한 푸시 알림은 거의 항상 작성자의 원문 텍스트를 포함합니다. 푸시 알림은 게시글이 생성될 때 대기열에 추가되며, 번역 작업이 완료되기 전에 번역본을 한 번만 조회합니다.

번역된 이메일은 오늘 이 답변에서 발표되었습니다 (#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초 후에 저장되었습니다. 관찰된 사례에서 수신자의 언어로 된 번역본은 게시글 생성 후 2초 후에 저장되었으나, 푸시 알림은 이미 원문 텍스트와 함께 발송된 상태였습니다.

지연 시간은 다음 쿼리를 통해 어떤 사이트에서도 확인할 수 있습니다:

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!은 작업 실행 시 user.effective_locale에 대해 TopicLocalization와 PostLocalization를 한 번만 조회합니다. 번역본을 찾지 못하면 원본 제목과 발췌문을 전송합니다. 대기하거나 재시도하는 로직은 없습니다.
  4. 알림 이메일은 NotificationEmailer를 통해 email_time_window_mins(기본값 10)의 지연을 거치므로, 이메일이 생성될 시점에는 번역본이 존재합니다.

app/jobs/regular/deliver_push_notification.rb은 v2026.7.3과 b5548f76 (2026-10-05)의 main 브랜치에서 동일합니다.

요청 사항

  1. 새 게시글에 대한 푸시 알림을 번역본이 저장될 때까지 대기하도록 합니다. 한 가지 옵션: 콘텐츠 로컬라이제이션이 활성화되어 있고 게시글에 감지된 로케일이 아직 없거나, 수신자의 로케일에 대한 로컬라이제이션이 예상되는 상태인데 존재하지 않는 경우, 짧은 지연 후 DeliverPushNotification을 한 번 다시 대기열에 추가하고 이후 사용 가능한 내용을 전송합니다. 몇 초의 지연으로 위에서 측정한 경우들을 커버할 수 있습니다.
  2. 공유된 규칙으로 콘텐츠를 선택합니다. 푸시 작업은 effective_locale을 사용하여 자체 조회를 수행합니다. #44240의 이메일 변경 사항은 ContentLocalization.show_translated_post?를 통해 처리되며 post_version을 비교합니다. 푸시에 동일한 경로를 사용하면 automatically_translate와 understood_languages를 준수하고, 오래된 번역본을 건너뛰며, 이메일 및 주제 뷰와 일관성을 유지할 수 있습니다.
  3. 라이브 알림에도 동일하게 적용합니다. PostAlerter.create_notification_alert에서 /notification-alert/:user_id에 게시되는 페이로드에는 원본 제목과 발췌문이 포함됩니다. post_alerter_live_notification_payload 수정자가 존재하지만, 코어에서는 페이로드를 로컬라이제이션하지 않습니다.

관련

2개의 좋아요