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

Posted

技术标签:

【中文标题】如何在 Symfony 布局中获取 _locale 变量?【英文标题】:How to get the _locale variable inside in a Symfony layout? 【发布时间】:2011-10-18 15:20:52 【问题描述】:

我在一个有 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());

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

原因是我想为所有用户提供漂亮的路线,无论他们是英国人还是法国人......而且也是出于 SEO 的原因!

【问题讨论】:

【参考方案1】:

---从评论中更新---

作为 Symfony 2.1,你必须使用

 app.request.locale 

 app.request.getLocale() 

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

【讨论】:

作为 Symfony 2.1,您必须改用 app.request.locale @Damien 在 php 模板中? @DomingoSL $view['request']->getLocale() 在 twig 中我更喜欢 app.request.getLocale() ,因为它返回 app.request.locale(如果可用)和 app.request.defaultLocale(如果未设置 app.request.locale)。 实际上,这两个选项都做同样的事情。在 Twig 中,如果没有提供名称的公共属性(如此处 - 请求上的 locale 属性受保护),则可以使用点语法访问 getter 方法。有关点运算符如何在 Twig 中工作的确切规则,请参阅 twig.sensiolabs.org/doc/templates.html#variables 下的“实现”部分【参考方案2】:

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

用户登录: 模式:/_locale/user/login.html 默认值: _controller: SfErrorsAppBundle:User:login

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

用户登录: 模式:/_locale/user/login.html 默认值: _controller: SfErrorsAppBundle:User:login 要求: _locale: fr|en

【讨论】:

要添加要求,您必须使用“requirements”关键字。你错过了最后的“s” => symfony.com/doc/current/book/routing.html#adding-requirements【参考方案3】:

由于 Symfony 2.1 将“语言环境”存储在请求而不是会话中,您必须使用它:

 app.request.getLocale() 

而不是 app.session.locale

【讨论】:

这个应该被接受,因为另一个已经过时,因此具有误导性 我想我和那些人有同样的经历,他们在第一个接受的答案上输了 5 分钟,@Sybio 请更改接受的答案 也许应该努力更新这个接受的答案;-)【参考方案4】:

在我看来,这是最简单且可维护的方式,无需担心 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 release notes了解更多信息

【讨论】:

以上是关于如何在 Symfony 布局中获取 _locale 变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 Symfony 和 locale 路由的重复内容?

Symfony2 - 在 TWIG 模板中获取当前 URL 或路由?

在 symfony2 parameters.yml 中获取环境变量

在视图之外使用 symfony 布局

允许没有参数的 Symfony2 路由的尾部斜杠?

Symfony2 Route 仅在整数时获取参数