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


68

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

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

原因是我想为所有用户提供漂亮的路线,无论他们是英语还是法语……而且出于搜索引擎优化的原因!

Answers:


163

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

作为Symfony 2.1,您必须使用

{{ app.request.locale }}

要么

{{ app.request.getLocale() }}

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


101
作为Symfony 2.1,必须app.request.locale改为使用。
达米安

@Damien并在php模板中?
DomingoSL

1
@DomingoSL$view['request']->getLocale()
iizno 2014年

5
同样在树枝上,我更喜欢,{{ app.request.getLocale() }}因为app.request.locale如果可用且未设置,app.request.defaultLocale则返回app.request.locale
Anticom 2014年

4
实际上,这两个选项都做相同的事情。在Twig中,如果没有提供名称的公共属性(如此处-locale请求中的属性受保护),则可以使用点语法来访问getter方法。有关点运算符在Twig中如何工作的确切规则,请参阅twig.sensiolabs.org/doc/templates.html#variables
Sam

105

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

{{ app.request.getLocale() }}

代替app.session.locale


11
这个应该被接受,因为另一个已经过时并因此产生误导
Gigala 2013年

1
我想我有过同样经历的那些人,谁刚刚失去了5分钟的第一个公认的答案,@Sybio请改变接受的答案
让-克里斯托夫Meillaud

也许应该作出的努力更新与此;-)接受的答案
Potherca

5

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

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

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

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

为了添加需求,您必须使用“ requirements”关键字。您错过了最后的“ s” => symfony.com/doc/current/book/routing.html#adding-requirements
Francesco Casula

2

我认为,这是自动检测语言环境的最简单且可维护的方法,而无需担心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发行说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.