如何在Symfony布局中获取_locale变量?

Syb*_*bio 64 layout routing templates translation symfony

我在一个有两种语言的网站上使用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}
Run Code Online (Sandbox Code Playgroud)

在模板内部,这并不困难,我只需要将$ this-> get('session') - > getLocale()从控制器传递给模板......

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

$router->generate('user_login_'.$locale, array());
Run Code Online (Sandbox Code Playgroud)

但在我的布局中,我当然有一个菜单和侧边栏,它们有链接......所以我想得到locale变量来使用它!所以我的问题很简单:如何在"布局"模板中获取此变量?否则,您是否有任何想法根据语言更改模式?

原因是我想为所有用户提供优美的路线,无论是英语还是法语......还有SEO的原因!

brk*_*rki 150

--- 评论的更新 ---

作为Symfony 2.1,你必须使用

{{ app.request.locale }}
Run Code Online (Sandbox Code Playgroud)

要么

{{ app.request.getLocale() }}
Run Code Online (Sandbox Code Playgroud)

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

  • 作为Symfony 2.1,你必须使用`app.request.locale`. (101认同)
  • 同样在twig我更喜欢`{{app.request.getLocale()}}`因为如果可用则返回`app.request.locale`,如果没有设置'app.request.locale`则返回`app.request.defaultLocale` . (5认同)
  • 实际上,这两个选项都做同样的事情.在Twig中,如果没有提供名称的公共属性,则可以使用点语法来访问getter方法(因为这里 - 请求的`locale`属性受到保护).有关点运算符在Twig中的工作原理的确切规则,请参阅http://twig.sensiolabs.org/doc/templates.html#variables下的"实现"部分. (3认同)

ben*_*ske 105

由于Symfony 2.1将"语言环境"存储在请求而不是会话中,您必须使用此方法:

{{ app.request.getLocale() }}
Run Code Online (Sandbox Code Playgroud)

而不是app.session.locale

  • 这个应该被接受,因为另一个已经过时,因此具有误导性 (11认同)

Vin*_*ler 5

此外,您可能希望简化路由(一个规则):

user_login:
    pattern:  /{_locale}/user/login.html
    defaults: { _controller: SfErrorsAppBundle:User:login }

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

user_login:
    pattern:  /{_locale}/user/login.html
    defaults: { _controller: SfErrorsAppBundle:User:login }
    requirements:
       _locale: fr|en