Класс LocaleSwitcher
Класс LocaleSwitcher из компонента symfony/translation
позволяет временно изменить локаль приложения.
Он принимает новую локаль и callback-функцию,
выполняет её в контексте указанной локали,
а после завершения автоматически возвращает
прежнее значение локали.
Это удобно, когда нужно перевести один фрагмент
текста или выполнить группу операций на другом языке,
не меняя глобальные настройки приложения.
Класс реализует паттерн "контекстный менеджер".
Метод runWithLocale принимает локаль
и callback, метод setLocale - только локаль,
метод getLocale возвращает текущую локаль,
а метод reset сбрасывает локаль к исходной.
Синтаксис
<?php
use Symfony\Component\Translation\LocaleSwitcher;
$switcher = new LocaleSwitcher($defaultLocale, $translator);
$res = $switcher->runWithLocale($locale, $callback);
$switcher->setLocale($locale);
$locale = $switcher->getLocale();
$switcher->reset();
?>
Пример
Давайте временно переключим локаль на 'fr'
и выполним callback, который вернёт текущую локаль:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Translation\LocaleSwitcher;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(LocaleSwitcher $switcher): Response
{
$res = $switcher->runWithLocale('fr', function (): string {
return 'locale is fr';
});
return new Response($res);
}
}
?>
Результат выполнения кода:
"locale is fr"
Пример
Давайте переведём строку с помощью транслятора
внутри callback на локали 'de':
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Translation\LocaleSwitcher;
use Symfony\Contracts\Translation\TranslatorInterface;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(
LocaleSwitcher $switcher,
TranslatorInterface $translator
): Response {
$res = $switcher->runWithLocale('de', function () use ($translator): string {
return $translator->trans('hello');
});
return new Response($res);
}
}
?>
Результат выполнения кода:
"Hallo"
Пример
Давайте переключим локаль через setLocale
и проверим текущее значение через getLocale:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Translation\LocaleSwitcher;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(LocaleSwitcher $switcher): Response
{
$switcher->setLocale('es');
$res = $switcher->getLocale();
return new Response($res);
}
}
?>
Результат выполнения кода:
"es"
Смотрите также
-
класс
Translator,
который выполняет перевод сообщений -
метод
runWithLocale,
который временно переключает локаль для callback -
метод
setLocale,
который устанавливает текущую локаль -
метод
reset,
который сбрасывает локаль к исходной