Я использую Symfony2, и я хотел добавить поддержку мультиязычности на моем сайте. У меня есть пакет Symfony / Symfony. Тем не менее, когда я делаю как документация говорит о настройке переменной локали. Я получаю следующее ошибка. мой класс выглядит
<?php
// src/AppBundle/EventListener/LocaleListener.php
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface
{
private $defaultLocale;
public function __construct($defaultLocale = 'en')
{
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
static public function getSubscribedEvents()
{
return array(
// must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
}
и сервис.имл
app.locale_listener:
class: AppBundle\EventListener\LocaleListener
arguments: ['%kernel.default_locale%']
tags:
- { name: kernel.event_subscriber }`
если у кого-нибудь из вас есть предложение, как решить эту проблему, я был бы рад услышать это.
РЕДАКТИРОВАТЬ:
Теперь я исправил проблему и через некоторое время заметил, что класс уже существует где-то еще в папке vendor. Этот класс работал и выглядел идентично моему. Поэтому я вставил свой код, и это решило его.
Вам не нужно использовать слушателя, чтобы использовать многоязычность.
У вас есть переводы, вы можете установить переменную локали на маршрутизации.
И установить значение по умолчанию.
Пример в моем приложении / config / routing.yml:
blog_bundle:
resource: "@BlogBundle/Resources/config/routing.yml"prefix: /{_locale}/blog
requirements:
_locale: fr|en|it|es
defaults: { _locale: fr}
Похоже, что Signature метода ваших getSubscribeedEvents не идентична объявлению интерфейса.
Попробуйте переключиться
статическая публичная функция getSubscribeedEvents ()
в
публичная статическая функция getSubscribeedEvents ()
public static function getSubscribedEvents()
{
return array(
// must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
Изменить в отношении ответа Стэнса:
Если это нормально для вас всегда носить с собой местный во всех ваших маршрутах, это правильный путь. Просто добавьте _locale к маршруту, и Symfony автоматически установит его в запросе.
Если вы не хотите использовать его в своих маршрутах и установить его на основе значения файла cookie или чего-то вроде вашего текущего TLD, правильный метод подписчика.