alengo/sulu-translated-media-bundle
Installation:
composer require alengo/sulu-translated-media-bundle:^3.0.5
Register the bundle in config/bundles.php and import admin routes in config/routes/sulu_admin.yaml.
Database Migration:
bin/adminconsole doctrine:schema:update --force
First Use Case: Upload a media file in Sulu CMS admin. Navigate to the "Additional Data" tab to set:
seoFilename (e.g., red-shoes-de.jpg for German locale)title and description per localeverifyDownload, aiGenerated).Render in Twig:
{{ sulu_translated_media_url(media, '800x', app.request.locale) }}
Media Upload & Translation:
seoFilename, title, description).seoFilename = "sneakers-en.jpg" for English and schuhe-de.jpg for German.URL Generation in Twig:
{{ sulu_translated_media_url(media, '800x', app.request.locale) }}
Output: /uploads/schuhe-de_800x.jpg (if locale is de).<picture> tags):
{% set urls = sulu_translated_media_urls(media, '800x', app.request.locale) %}
<picture>
<source srcset="{{ urls.webp }}" type="image/webp">
<img src="{{ urls.default }}">
</picture>
Integration with Sulu’s Media System:
Entity\Media or use it directly.MediaTranslationsAwareInterface or MediaAdditionalDataInterface in custom media entities for additional fields.Format Management:
TranslatedFormatManager (e.g., add custom WebP presets).# config/packages/translated_media.yaml
sulu_translated_media:
formats:
- name: 'webp_800x'
extension: 'webp'
mime_type: 'image/webp'
quality: 80
Admin Customization:
# config/packages/sulu_admin.yaml
sulu_admin:
resources:
media:
admin:
groups:
additional_data:
label: 'Custom Additional Data'
icon: 'cog'
Locale Fallback:
seoFilename is set for the current locale, the bundle falls back to the default locale (configured in Sulu). Ensure default locale translations exist.$media->getSeoFilename(app.request->getLocale()); // Returns null if unset
File Permissions:
uploads/ directory is writable by the web server:
chmod -R 775 var/uploads
Format Cache & Memoization:
FormatCacheInterface (introduced in v3.0.3) now includes memoization for improved performance. Clear cache after adding new formats:
bin/adminconsole cache:clear
WebP Support:
imagick or gd PHP extensions with WebP support. Verify with:
php -m | grep imagick
sulu_translated_media_urls() output for null in the webp key.Database Schema:
me_media_translations table is auto-created, but manual schema updates may fail if Sulu’s base schema changes. Backup before running migrations.Check Generated URLs:
/_profiler) to inspect the sulu_translated_media_url() function call and verify the resolved path.Admin Tab Missing:
TranslatedMediaBundle in sulu_admin.yaml).bin/adminconsole cache:clear
Symlink Issues:
uploads/:
ls -la var/uploads | grep -E 'schuhe-de\.jpg|red-shoes-en\.jpg'
php bin/adminconsole sulu:media:generate-symlinks
Memoization Debugging:
FormatCache service:
bin/adminconsole debug:container sulu_translated_media.format_cache
cache:clear command was run after configuration changes.Custom Media Entity:
Entity\Media to add project-specific fields:
use Alengo\SuluTranslatedMediaBundle\Entity\Media as BaseMedia;
class CustomMedia extends BaseMedia {
// Add custom fields here
}
config/packages/sulu_media.yaml:
sulu_media:
objects:
media:
model: App\Entity\CustomMedia
Override Twig Functions:
config/packages/twig.yaml:
twig:
globals:
sulu_translated_media_url: '@TranslatedMediaBundle/twig/sulu_translated_media_url'
sulu_translated_media_urls: '@TranslatedMediaBundle/twig/sulu_translated_media_urls'
Format Manager:
TranslatedFormatManager entirely by binding a custom service:
# config/services.yaml
services:
App\Service\CustomFormatManager:
tags: ['sulu_translated_media.format_manager']
Admin Tab Customization:
{# templates/sulu_admin/media/additional_data.html.twig #}
{% extends '@TranslatedMediaBundle/admin/media/additional_data.html.twig' %}
{% block additional_fields %}
{{ parent() }}
<div class="field">
<label>Custom Field</label>
<input type="text" name="custom_field">
</div>
{% endblock %}
Memoization Customization:
FormatCache service:
# config/services.yaml
services:
App\Cache\CustomFormatCache:
arguments:
$cachePool: '@cache.app'
$ttl: 3600 # Custom TTL in seconds
tags: ['sulu_translated_media.format_cache']
How can I help you explore Laravel packages today?