如何在Symfony布局中获取_localevariables?

我在一个拥有2种语言的站点上使用Symfony 2,我想根据用户语言环境语言来改变路由模式!

例:

user_login_en: pattern: /en/user/login.html defaults: { _controller: SfErrorsAppBundle:User:login, _locale: en } user_login_fr: pattern: /fr/utilisateur/connexion.html defaults: { _controller: SfErrorsAppBundle:User:login, _locale: fr} 

在模板里面,这并不难,我只需要将$ this-> get('session') – > getLocale()从控制器传递给模板。

为了工作,我必须打电话给我的路线:

 $router->generate('user_login_'.$locale, array()); 

但在我的布局,我当然有一个菜单,和侧链,有链接…所以我想要获取localevariables来使用它! 所以我的问题很简单:如何获得“布局”模板内的这个variables? 否则,你有任何想法改变模式取决于语言?

原因是我想为所有用户提供美丽的路线,无论他们是英语还是法语…还有一个search引擎优化的原因!

从评论更新

由于Symfony 2.1,你必须使用

 {{ app.request.locale }} 

要么

 {{ app.request.getLocale() }} 

如果app.request.locale可用,则返回app.request.locale如果没有设置app.request.defaultLocale则返回app.request.locale

由于Symfony 2.1将“区域设置”存储在请求中而不是会话中,所以您必须使用这个:

 {{ app.request.getLocale() }} 

而不是app.session.locale

另外,您可能想要简化您的路由(单个规则):

用户login:
    模式:/{_locale}/user/login.html
    默认:{_controller:SfErrorsAppBundle:用户:login}

如果您只想要允许某些语言,则可以添加一个要求:

用户login:
    模式:/{_locale}/user/login.html
    默认:{_controller:SfErrorsAppBundle:用户:login}
    要求:
        _locale:fr | en

在我看来,这是自动检测语言环境而不用担心Symfony版本的最简单方便的方法

 {% if not app.session.locale is null %} {# Prior to Symfony 2.1 you must get from session, it will be null if upper #} Locale: {{ app.session.locale }} {% else %} {# With Symfony 2.1 or upper you only can get the locale from request #} Locale: {{ app.request.locale }} {% endif %} 

另外,如果你喜欢它,你可以在Twig模板引擎中使用象记法这样对象

 {% if not app.getSession().getLocale() is null %} {# Prior to Symfony 2.1 you must get from session, it will be null if upper #} Locale: {{ app.getSession().getLocale() }} {% else %} {# With Symfony 2.1 or upper you only can get the locale from request #} Locale: {{ app.getRequest().getLocale() }} {% endif %} 

有关更多信息,请参阅Symfony 2.1.0发行说明