La localisation du contenu utilise l’URL brute du bucket R2 au lieu de l’URL CDN S3 dans les articles traduits

Bonjour,

Lors de l’utilisation de la localisation du contenu avec les traductions Discourse AI et Cloudflare R2 comme stockage compatible S3, le contenu des posts traduits stocke l’URL brute du point d’accès (endpoint) du bucket R2 au lieu de l’s3_cdn_url configuré (domaine personnalisé). Les images sont affichées en erreur pour tous les utilisateurs consultant les traductions.

Environnement

  • Discourse : dernière version
  • Cloudflare R2 configuré via un stockage compatible S3
  • s3_cdn_url : https://files.mydomain.com
  • s3_use_cdn_url_for_all_uploads : activé
  • Localisation du contenu + traduction Discourse AI : activés

Étapes pour reproduire

  1. Configurer Cloudflare R2 avec un domaine personnalisé (s3_cdn_url)
  2. Activer la localisation du contenu et la traduction IA
  3. Créer un post contenant une image
  4. Attendre que la traduction IA génère la version localisée
  5. Changer de langue — les images dans la version traduite sont cassées

Comportement observé

Le contenu traduit contient des URL comme :

//files.myendpoint.r2.cloudflarestorage.com/original/1X/ au lieu de https://files.mydomain.com/original/1X/

Bogue lié : Chat thumbnails bypass s3_cdn_url & use raw S3 bucket URLs

Un correctif temporaire consiste à effectuer un remappage ou à utiliser ce tc :

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());
});

Je ne suis pas vraiment sûr de ça. J’ai des buckets Cloudflare R2 pour le stockage d’objets et les sauvegardes sur notre site, et nous avons plusieurs langues avec la traduction par IA — les images se chargent parfaitement dans toutes les versions.

Par exemple :

Anglais

Allemand

Russe

Portugais

Oui, dans mes tests, je télécharge de 3 à 5 images. Mais seulement 1 ou 2 fonctionnent comme prévu.