路线中的 Symfony2 语言环境

发布于 2024-11-03 20:36:03 字数 396 浏览 3 评论 0原文

我关注了 Symfony2 文档 http://symfony.com /doc/2.0/book/translation.html#the-locale-and-the-url 并将区域设置添加到我的路线中。但是,当我将 {{ path('myroute') }} 放置在 twig 模板中时,我找不到通过路由携带语言环境的方法,但语言环境总是获取回退值而不是采用当前语言环境。

我尝试了 {{ path('myroute', {'_locale': _locale}) }} 但出现错误“变量“_locale”不存在”。

有什么想法吗?

I followed Symfony2 doc http://symfony.com/doc/2.0/book/translation.html#the-locale-and-the-url and added locale to my routes. But, I can't find the way to carry locale through routes as I place {{ path('myroute') }} in twig template, but locale always gets fallback value instead taking current locale.

I tried {{ path('myroute', {'_locale': _locale}) }} but I got error "Variable "_locale" does not exist".

Any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

这样的小城市 2024-11-10 20:36:03

Fixed with {{ path('address', {'_locale': app.request.attributes.get('_locale')}) }} thanks to this thread http://www.mail-archive.com/[email protected]/msg34838.html.

像你 2024-11-10 20:36:03

在 Symfony2.1 中,区域设置存储在请求中,因此您必须使用:

{{ path('address', {'_locale': app.request.locale}) }}

In Symfony2.1 the locale is stored in the request, so you have to use this:

{{ path('address', {'_locale': app.request.locale}) }}
安静 2024-11-10 20:36:03

两个页面:

localhost.lo/xx/about

localhost.lo/xx/hello/{name}

其中 xx -routing.yml 中描述的几个语言环境 --routing.yml

--

home:
  resource: "@JetInformBundle/Resources/config/routing.yml"
  prefix: /{_locale}
  requirements:
    _locale: ^en|de|ru|uk|pl$

JetInformBundlerouting.yml

hello:
  pattern:  /hello/{name}
  defaults: { _controller: JetInformBundle:Default:index, name: 'alexander' }

about:
  pattern:  /about
  defaults: { _controller: JetInformBundle:Default:about }

-- DefaultController.php

<?php

namespace Jet\InformBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function indexAction($name, Request $request)
    {
        return $this->render('JetInformBundle:Default:index.html.twig',
                             array('name' => $name, 'matches' =>     $this->matchAction($request)));
    }

    public function aboutAction(Request $request)
    {
        return $this->render('JetInformBundle:Default:about.html.twig',
                              array('matches' => $this->matchAction($request)));
    }

    protected function matchAction(Request $request)
    {
        return $this->get('router')->match($request->getRequestUri());
    }
}

-- index .html.twig

{% extends '::base.html.twig' %}

{% block body %}
<h1>{{ 'hello.name'|trans }} {{ name }}!</h1>
<h3>{{ 'your.locale'|trans }} [{{ app.request.get('_locale') }}]</h3>

{% include 'JetInformBundle:Default:locales.html.twig'
            with {
                'uripath': 'hello',
                'params': {
                    'name': app.request.get('name')
                }
            }
%}

{% include 'JetInformBundle:Default:matches.html.twig'
            with { 'matches': matches } %}

<div>
    <p>{{ 'return.to'|trans }} <a href="{{ path('about', { '_locale': app.request.get('_locale') }) }}">About</a></p>
</div>
{% endblock %}

-- about.html.twig

{% extends '::base.html.twig' %}

{% block body %}
<h1>{% trans %}about.page{% endtrans %}</h1>
<h3>{% trans %}your.locale{% endtrans %} [{{ app.request.get('_locale') }}]</h3>

{% include 'JetInformBundle:Default:locales.html.twig'
            with { 'uripath': 'about', 'params': {}} %}

{% include 'JetInformBundle:Default:matches.html.twig'
            with { 'matches': matches } %}

<div>
    <p>{% trans%}return.to{% endtrans%} <a href="{{ path('hello', { 'name': app.request.get('name'), '_locale': app.request.get('_locale') }) }}">Hello</a></p>
</div>
{% endblock %}

-- locales.html.twig

{% if not params %}
    {% set params = {} %}
{% endif %}

<div class="langs">
    <ul>
        <li>
            {% if app.request.get('_locale') == 'ru' %}
                Русский
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'ru' })) }}">Русский</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'en' %}
                English
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'en' })) }}">English</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'uk' %}
                Украiнська
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'uk' })) }}">Украiнська</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'de' %}
                Deutsch
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'de' })) }}">Deutsch</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'pl' %}
                Polish
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'pl' })) }}">Polish</a>
            {% endif %}
        </li>
    </ul>
</div>

-- matches.html.twig

<h5>Matches</h5>
<ol>
{% for key, value in matches %}
    <li>{{ key }} : {{ value }} </li>
{% endfor %}
</ol>

Two pages:

localhost.lo/xx/about

localhost.lo/xx/hello/{name}

where xx - several locales described in routing.yml

-- routing.yml

home:
  resource: "@JetInformBundle/Resources/config/routing.yml"
  prefix: /{_locale}
  requirements:
    _locale: ^en|de|ru|uk|pl$

-- JetInformBundle routing.yml

hello:
  pattern:  /hello/{name}
  defaults: { _controller: JetInformBundle:Default:index, name: 'alexander' }

about:
  pattern:  /about
  defaults: { _controller: JetInformBundle:Default:about }

-- DefaultController.php

<?php

namespace Jet\InformBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function indexAction($name, Request $request)
    {
        return $this->render('JetInformBundle:Default:index.html.twig',
                             array('name' => $name, 'matches' =>     $this->matchAction($request)));
    }

    public function aboutAction(Request $request)
    {
        return $this->render('JetInformBundle:Default:about.html.twig',
                              array('matches' => $this->matchAction($request)));
    }

    protected function matchAction(Request $request)
    {
        return $this->get('router')->match($request->getRequestUri());
    }
}

-- index.html.twig

{% extends '::base.html.twig' %}

{% block body %}
<h1>{{ 'hello.name'|trans }} {{ name }}!</h1>
<h3>{{ 'your.locale'|trans }} [{{ app.request.get('_locale') }}]</h3>

{% include 'JetInformBundle:Default:locales.html.twig'
            with {
                'uripath': 'hello',
                'params': {
                    'name': app.request.get('name')
                }
            }
%}

{% include 'JetInformBundle:Default:matches.html.twig'
            with { 'matches': matches } %}

<div>
    <p>{{ 'return.to'|trans }} <a href="{{ path('about', { '_locale': app.request.get('_locale') }) }}">About</a></p>
</div>
{% endblock %}

-- about.html.twig

{% extends '::base.html.twig' %}

{% block body %}
<h1>{% trans %}about.page{% endtrans %}</h1>
<h3>{% trans %}your.locale{% endtrans %} [{{ app.request.get('_locale') }}]</h3>

{% include 'JetInformBundle:Default:locales.html.twig'
            with { 'uripath': 'about', 'params': {}} %}

{% include 'JetInformBundle:Default:matches.html.twig'
            with { 'matches': matches } %}

<div>
    <p>{% trans%}return.to{% endtrans%} <a href="{{ path('hello', { 'name': app.request.get('name'), '_locale': app.request.get('_locale') }) }}">Hello</a></p>
</div>
{% endblock %}

-- locales.html.twig

{% if not params %}
    {% set params = {} %}
{% endif %}

<div class="langs">
    <ul>
        <li>
            {% if app.request.get('_locale') == 'ru' %}
                Русский
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'ru' })) }}">Русский</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'en' %}
                English
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'en' })) }}">English</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'uk' %}
                Украiнська
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'uk' })) }}">Украiнська</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'de' %}
                Deutsch
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'de' })) }}">Deutsch</a>
            {% endif %}
        </li>
        <li>
            {% if app.request.get('_locale') == 'pl' %}
                Polish
            {% else %}
                <a href="{{ path(uripath, params|merge({ '_locale': 'pl' })) }}">Polish</a>
            {% endif %}
        </li>
    </ul>
</div>

-- matches.html.twig

<h5>Matches</h5>
<ol>
{% for key, value in matches %}
    <li>{{ key }} : {{ value }} </li>
{% endfor %}
</ol>
咋地 2024-11-10 20:36:03

简写符号:

{{ path('address', {'_locale': app.session.locale}) }}

Shorthand notation:

{{ path('address', {'_locale': app.session.locale}) }}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文