Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Sulu Translated Media Bundle Laravel Package

alengo/sulu-translated-media-bundle

View on GitHub
Deep Wiki
Context7

SuluTranslatedMediaBundle

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, description in me_media_translations
  • Built-in Media entity — ready-to-use Media entity extending Sulu's base; no project entity required
  • TranslatedFormatManager — replaces Sulu's default FormatManager via compiler pass
  • Twig functionssulu_translated_media_url() / sulu_translated_media_urls() with WebP support
  • Admin tab — "Additional Data" tab auto-registered in the Sulu Media admin
  • Zero-configsulu_media.objects.media.model and sulu_admin resources 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
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle