Nous allons voir comment configurer une interface d’administration en multilingue avec un bouton de sélection de langue (language switcher).
Installation de translationBundle
composer require sonata-project/translation-bundle
bin/console assets:install
Le language switcher nécessite un filtre twig spécifique.
Sinon vous aurez une erreur de type :
Unknown "language_name" filter.
Il faut alors installer ces deux bundles
composer require twig/intl-extra
composer require twig/extra-bundle
bin/console cache:clear
On ajoute la configuration par défaut
# config/packages/sonata_translation.yaml
sonata_translation:
locales: [en, fr, it, nl, es]
default_locale: en
# change default behavior for translated field filtering.
default_filter_mode: gedmo # must be either 'gedmo' or 'knplabs', default: gedmo
# here enable the types you need
gedmo:
enabled: true
knplabs:
enabled: true
#phpcr:
# enabled: true
Et on ajoute les styles dans l’admin
# config/packages/sonata_admin.yaml
sonata_admin:
assets:
extra_stylesheets:
- bundles/sonatatranslation/css/sonata-translation.css
On surcharge l’affichage du template sonata
# config/packages/sonata_admin.yaml
sonata_admin:
templates:
layout: '@SonataTranslation/standard_layout.html.twig'
On rajoute les routes
# config/routes.yaml
sonata_translation:
resource: '@SonataTranslationBundle/Resources/config/routes.yaml'
Et on active le language switcher
# config/packages/sonata_translation.yaml
sonata_translation:
locale_switcher: true
Et dernier point pour éviter l’erreur
Argument 5 passed to Twig\Extra\Intl\IntlExtension::formatDateTime() must be of the type string, null given,
Il faudra charger l’extension twig/extra-bundle avant SonataIntlBundle de sorte que la fonction formatDateTime de sonataIntl surcharge celle de TwigExtraBundle.
Ce qui nous donne ceci :
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
Sonata\IntlBundle\SonataIntlBundle::class => ['all' => true],
Sonata\TranslationBundle\SonataTranslationBundle::class => ['all' => true],
Adapter l’exemple à la version installée
Les exemples Symfony et Sonata restent attachés aux versions indiquées dans l’article. Symfony 4.x et Symfony 6.2 ne sont plus maintenus : pour un projet actuel, utilisez une branche maintenue et la documentation correspondant exactement à vos dépendances.
php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle
Avant de reprendre le code, contrôlez les signatures, les services, les routes et les templates concernés. Ajoutez ensuite un test fonctionnel couvrant les autorisations, le code HTTP et le résultat visible.
Référence : versions Symfony maintenues.