如何在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发行说明