alengo / sulu-translated-media-bundle
SEO-friendly translated media filenames for Sulu CMS
Package info
github.com/alengodev/SuluTranslatedMediaBundle
Type:symfony-bundle
pkg:composer/alengo/sulu-translated-media-bundle
Requires
- php: ^8.2
- doctrine/orm: ^3.0
- sulu/sulu: ~3.0
- symfony/framework-bundle: ^7.0
- symfony/string: ^7.0
- twig/twig: ^3.0
README
SEO-friendly translated media filenames for Sulu CMS 3.x.
Serves media files under locale-specific SEO filenames (e.g. /uploads/red-shoes-de.jpg) while keeping the original file stored under its original name. Includes an "Additional Data" admin tab with locale-aware title, description, and SEO filename fields — plus optional boolean flags (verifyDownload, aiGenerated).
Features
- Translated filenames — per-locale
seoFilename,title,descriptioninme_media_translations - Built-in Media entity — ready-to-use
Mediaentity extending Sulu's base; no project entity required - TranslatedFormatManager — replaces Sulu's default FormatManager via compiler pass
- Twig functions —
sulu_translated_media_url()/sulu_translated_media_urls()with WebP support - Admin tab — "Additional Data" tab auto-registered in the Sulu Media admin
- Zero-config —
sulu_media.objects.media.modelandsulu_adminresources are auto-configured
Requirements
- PHP 8.2+
- Sulu CMS ~3.0
- Symfony 7.x
Installation
composer require alengo/sulu-translated-media-bundle
Register the bundle in config/bundles.php:
Alengo\SuluTranslatedMediaBundle\TranslatedMediaBundle::class => ['all' => true],
Import the admin API routes in config/routes/sulu_admin.yaml:
TranslatedMediaBundle: resource: "@TranslatedMediaBundle/Resources/config/routing_admin_api.yaml" prefix: /admin/api
Run a database migration or schema update to create the me_media_translations table:
bin/adminconsole doctrine:schema:update --force
That's it — no further configuration required.
Twig Usage
{# Single URL with translated filename #} {{ sulu_translated_media_url(media, '800x', app.request.locale) }} {# With explicit format override #} {{ sulu_translated_media_url(media, '800x', 'de', 'webp') }} {# All format URLs (default + WebP) for use in <picture> / srcset #} {% set urls = sulu_translated_media_urls(media, '800x', app.request.locale) %} <picture> <source srcset="{{ urls.webp }}" type="image/webp"> <img src="{{ urls.default }}"> </picture>
Provided Models
| Class | Purpose |
|---|---|
Entity\Media |
Concrete Doctrine entity (me_media) — use directly or extend |
Entity\MediaTranslations |
Locale rows in me_media_translations |
Model\MediaTranslationsAwareInterface + MediaTranslationsTrait |
Locale fields: title, description, seoFilename |
Model\MediaAdditionalDataInterface + MediaAdditionalDataTrait |
Boolean flags: verifyDownload, aiGenerated |