Symfony 4 / Sonata: Gestión de una Interfaz de Administración Multilingüe

Veremos cómo configurar una interfaz de administración multilingüe con un botón de selección de idioma (conmutador de idioma).

Instalación de translationBundle

composer require sonata-project/translation-bundle

bin/console assets:install

El conmutador de idioma requiere un filtro twig específico.
De lo contrario, obtendrás un error como:

Unknown "language_name" filter.

Luego, necesitas instalar estos dos paquetes

composer require twig/intl-extra
composer require twig/extra-bundle
bin/console cache:clear

Agregamos la configuración predeterminada

# 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

E incluimos estilos en la administración

# config/packages/sonata_admin.yaml

sonata_admin:
    assets:
        extra_stylesheets:
            - bundles/sonatatranslation/css/sonata-translation.css

Sobrescribimos la visualización de la plantilla de sonata

# config/packages/sonata_admin.yaml

sonata_admin:
    templates:
        layout: '@SonataTranslation/standard_layout.html.twig'

Agregamos las rutas

# config/routes.yaml

sonata_translation:
    resource: '@SonataTranslationBundle/Resources/config/routes.yaml'

Y habilitamos el conmutador de idiomas

# config/packages/sonata_translation.yaml

sonata_translation:
    locale_switcher: true

Y el último punto para evitar el error

Argument 5 passed to Twig\Extra\Intl\IntlExtension::formatDateTime() must be of the type string, null given,



Tendrás que cargar el twig/extra-bundle antes del SonataIntlBundle para que la función formatDateTime de sonataIntl sobrescriba la de TwigExtraBundle.

Esto nos da:

    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