Parlons de votre projet
PHP Symfony Sonata

Symfony 4 / Sonata : gérer une interface d’administration multilingue

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...

Symfony 4 / Sonata : gérer une interface d’administration multilingue

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

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.

Partager cet article