Здравствуйте,
При использовании локализации контента с переводом Discourse AI и Cloudflare R2 в качестве S3-совместимого хранилища, переведенный контент постов сохраняет исходный URL конечной точки R2-бакета вместо настроенного s3_cdn_url (домен по выбору). Изображения отображаются битыми для всех пользователей, просматривающих переводы.
Окружение
- Discourse: последняя версия
- Cloudflare R2 настроено через S3-совместимое хранилище
s3_cdn_url:https://files.mydomain.coms3_use_cdn_url_for_all_uploads: включено- Локализация контента + перевод Discourse AI: включены
Шаги для воспроизведения
- Настройте Cloudflare R2 с пользовательским доменом (
s3_cdn_url) - Включите локализацию контента и перевод AI
- Создайте пост с изображением
- Дождитесь генерации локализованной версии переводами AI
- Переключите язык — изображения в переведенной версии будут битыми
Наблюдаемое поведение
Переведенный контент содержит URL вида:
//files.myendpoint.r2.cloudflarestorage.com/original/1X/, а не https://files.mydomain.com/original/1X/
Связанный баг: Chat thumbnails bypass s3_cdn_url & use raw S3 bucket URLs
Временное решение — выполнить перемapping или использовать этот 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());
});



