Content Localization verwendet in übersetzten Beiträgen die rohe R2-Bucket-URL statt der S3-CDN-URL

Hallo,

Wenn Content Localization mit Discourse AI-Übersetzungen und Cloudflare R2 als S3-kompatiblem Speicher verwendet wird, speichert der übersetzte Beitragsinhalt die rohe R2-Bucket-Endpunkt-URL anstelle der konfigurierten s3_cdn_url (benutzerdefinierte Domain). Für alle Benutzer, die Übersetzungen anzeigen, werden Bilder nicht korrekt dargestellt.

Umgebung

  • Discourse: neueste Version
  • Cloudflare R2 über S3-kompatiblen Speicher konfiguriert
  • s3_cdn_url: https://files.mydomain.com
  • s3_use_cdn_url_for_all_uploads: aktiviert
  • Content Localization + Discourse AI-Übersetzung: aktiviert

Schritte zur Reproduktion

  1. Konfigurieren Sie Cloudflare R2 mit einer benutzerdefinierten Domain (s3_cdn_url)
  2. Aktivieren Sie Content Localization und KI-Übersetzung
  3. Erstellen Sie einen Beitrag mit einem Bild
  4. Warten Sie, bis die KI-Übersetzung die lokalisierte Version erstellt hat
  5. Wechseln Sie die Sprache – die Bilder in der übersetzten Version sind kaputt

Beobachtetes Verhalten

Der übersetzte Inhalt enthält URLs wie:

//files.myendpoint.r2.cloudflarestorage.com/original/1X/ anstelle von https://files.mydomain.com/original/1X/

Zusammenhängender Bug: Chat thumbnails bypass s3_cdn_url & use raw S3 bucket URLs

Ein temporärer Fix besteht darin, ein Remapping durchzuführen oder dieses Theme Component zu verwenden:

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer("1.8.0", (api) => {
  const badDomain = "files.myendpoint.r2.cloudflarestorage.com";
  const goodDomain = "files.mydomain.com";

  function fixImages() {
    document.querySelectorAll(`img[src*="${badDomain}"]`).forEach(img => {
      img.src = img.src.replace(badDomain, goodDomain);
    });
    document.querySelectorAll(`img[data-src*="${badDomain}"]`).forEach(img => {
      img.dataset.src = img.dataset.src.replace(badDomain, goodDomain);
    });
    document.querySelectorAll(`img[data-large-src*="${badDomain}"]`).forEach(img => {
      img.dataset.largeSrc = img.dataset.largeSrc.replace(badDomain, goodDomain);
    });
  }

  api.decorateCooked(() => fixImages(), { id: "fix-r2-translated-images" });
  api.onPageChange(() => fixImages());
});

Da bin ich mir nicht ganz sicher. Wir haben Cloudflare-R2-Buckets für die Objektspeicherung und Backups auf unserer Website, und wir nutzen mehrere Sprachen mit KI-Übersetzung – die Bilder laden in allen davon einwandfrei.

Zum Beispiel:

Englisch

Deutsch

Russisch

Portugiesisch

Ja, in meinen Tests lade ich 3 bis 5 Bilder hoch. Aber nur 1 oder 2 funktionieren wie erwartet.