0

我正在使用 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)),
    );
}
}

和 service.yml

 app.locale_listener:
        class: AppBundle\EventListener\LocaleListener
        arguments: ['%kernel.default_locale%']
        tags:
            - { name: kernel.event_subscriber }`

如果你们中的任何人对如何解决这个问题有任何建议,我很高兴听到它。

编辑:我现在解决了这个问题,过了一会儿我注意到该类已经存在于供应商文件夹中的其他地方。那门课很有效,看起来和我的一模一样。所以我插入了我的代码并解决了它。

4

2 回答 2

0

您不必使用听众来使用多语言。你有翻译,你可以在路由上设置语言环境变量。并设置一个默认值。

我的 app/config/routing.yml 中的示例

blog_bundle:
    resource: "@BlogBundle/Resources/config/routing.yml"
    prefix:   /{_locale}/blog
    requirements:
        _locale: fr|en|it|es
    defaults: { _locale: fr}
于 2016-07-01T11:44:55.177 回答
0

看起来您的 getSubscribedEvents 的方法签名与接口声明不同。

尝试将静态公共函数 getSubscribedEvents() 切换为公共静态函数 getSubscribedEvents()

public static function getSubscribedEvents()
{
    return array(
        // must be registered before the default Locale listener
        KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
    );
}

编辑关于斯坦斯的回答: 如果您可以在所有路线中始终携带当地人,那是正确的方式。只需将 _locale 添加到路由中,symfony 就会自动在请求中设置它。如果您不想在路由中使用它并根据 cookie 值或当前 TLD 之类的东西设置它,那么订阅者方法是正确的方法。

于 2016-07-01T14:07:59.327 回答