Symfony 4 / Sonata : gérer une interface d'admin multi langue

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],
Sélection_413