Новое в Symfony 6.1: динамический переключатель локали (Locale Switcher)
12721

Новое в Symfony 6.1: динамический переключатель локали (Locale Switcher)


Работа с локализацией в приложениях Symfony проста. Локаль хранится в атрибуте запроса под названием _locale и используется в остальной части приложения. Изменение локали (например, в многоязычных приложениях с помощью списка языков, выбираемых пользователями) требует изменения атрибута запроса в предыдущем слушателе событий (Event Listener).

Однако иногда необходимо динамически изменить локаль приложения только для того, чтобы выполнить некоторый код. Представьте себе приложение, которое отображает Twig-шаблоны писем на разных языках. Вам нужно изменить локаль только для того, чтобы отобразить эти шаблоны.

В Symfony 6.1 мы решаем подобные кейсы благодаря новому переключателю локали. Объект/сервис LocaleSwitcher позволяет вам сразу изменить локаль всех сервисов, которые помечены kernel.locale_aware.

use Symfony\Component\Translation\LocaleSwitcher;

class SomeClass
{
    public function __construct(
        private LocaleSwitcher $localeSwitcher,
    ) {}

    public function someMethod()
       {
        // you can get the current application locale like this:
        $currentLocale = $this->localeSwitcher->getLocale();

        // you can set the locale for the entire application like this:
        // (from now on, the application will use 'fr' (French) as the
        // locale; including the default locale used to translate Twig templates)
        $this->localeSwitcher->setLocale('fr');

        // you can also run some code with a certain locale, without
        // changing the locale for the rest of the application
        $this->localeSwitcher->runWithLocale('es', function() {

            // e.g. render here some Twig templates using 'es' (Spanish) locale

        });

        // ...
    }
}