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],
Adaptar el ejemplo a la versión instalada
Los ejemplos de Symfony y Sonata permanecen ligados a las versiones indicadas en el artículo. Symfony 4.x y Symfony 6.2 ya no se mantienen: para un proyecto actual, utilice una rama mantenida y la documentación que corresponda exactamente a sus dependencias.
php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle
Antes de retomar el código, controle las firmas, los servicios, las rutas y las plantillas correspondientes. Después, agregue una prueba funcional que cubra los permisos, el código HTTP y el resultado visible.
Referencia: versiones de Symfony mantenidas.