【问题标题】:How to get the _locale variable inside in a Symfony layout?如何在 Symfony 布局中获取 _locale 变量?
【发布时间】: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 的原因!

【问题讨论】:

    标签: templates layout routing translation symfony


    【解决方案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

    【讨论】:

    【解决方案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了解更多信息

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 2019-07-20
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2019-01-06
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多