更改Symfony 2.3的语言环境

5

我刚开始学习Symfony。 我试图构建一个多语言的网站,但是在更改区域设置时遇到了问题。

我看了一些帖子并阅读了相关文档,但是区域设置并没有发生变化,我尝试了以下方法:

public function indexAction()
{    
    $this->get('session')->set('_locale', 'fr');

    $request = $this->getRequest();
    $locale = $request->getLocale();
    return $this->render('PhoneMainBundle:Default:index.html.twig',array('locale'=>$locale));
}

但是$locale中的值总是'en'(我的默认区域设置)

我还尝试过

public function indexAction()
{    
    $this->get('session')->set('_locale', 'fr');

    $request = $this->getRequest();
    $request->setLocale('fr');
    $locale = $request->getLocale();

    return $this->render('PhoneMainBundle:Default:index.html.twig',array('locale'=>$locale));
}

在这种情况下,$locale 是法语,但翻译始终来自 messages.en.yml。
首先,我想使用 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 检测用户的语言环境,也许可以在每个页面刷新时使用监听器?
之后,我将创建一个路由来改变语言环境。但我想找到一种改变语言环境的方法。
感谢您的帮助。
3个回答

9
基于 thisthis 的回答。

LanguageListener.php:

<?php

namespace Acme\UserBundle\EventListener;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class LanguageListener
{
    private $session;

    public function setSession(Session $session)
    {
        $this->session = $session;
    }

    public function setLocale(GetResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();
        $request->setLocale($request->getPreferredLanguage(array('en', 'de')));

    }
}

services.yml:

acme.language.kernel_request_listener:
    class: Acme\UserBundle\EventListener\LanguageListener
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: setLocale }

关于Twig中错误的本地化检测,可能有很多不同的原因。在SO上搜索,您肯定会找到答案。确保您的'_local'变量定义正确,确保您将语言文件放在正确的位置等。最后,请再次阅读文档的最新版本:http://symfony.com/doc/current/book/translation.html

这里的函数setSession是什么作用? - PASTAGA

0

然而,我添加了这个来使它更加动态化

services.yml

 services:
        acme.language.kernel_request_listener:
            class: Acme\UserBundle\EventListener\LanguageListener
            tags:
                - { name: kernel.event_listener, event: kernel.request, method: setLocale }
            arguments: [ @router, @service_container ]

LanguageListener.php:

<?php

namespace Acme\UserBundle\EventListener;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class LanguageListener
{
     private $session;
     private $container;
     private $router;

    public function __construct($router, $container)
    {
        // ...
        $this->router= $router;
        $this->container = $container;
    }

    public function setSession(Session $session)
    {
        $this->session = $session;
    }

    public function setLocale(GetResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();    
        $request->setLocale($request->getPreferredLanguage($this->container->parameters['jms_i18n_routing.locales']));

    }
}

只是为了能够从config.yml中获取参数和值。

敬礼, Wick


0

如果例如你的默认语言环境是法语,但有一个控制器你想要将默认语言环境设置为英语,可以这样做:

routing.yml

desktop_comingsoonpage:
    resource: "@RemmelComparabusBundle/Controller/ComingsoonpageController.php"
    defaults: { _locale: en }
    type:     annotation

更多信息: Symfony文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接