2011-04-27 5 views
6

J'ai suivi le document http://symfony.com/doc/2.0/book/translation.html#the-locale-and-the-url de Symfony2 et ajouté les paramètres régionaux à mes itinéraires. Mais, je ne peux pas trouver le moyen d'acheminer les paramètres régionaux via des routes comme je place {{path ('myroute')}} dans le modèle de brindille, mais les paramètres régionaux obtiennent toujours la valeur de repli.Paramètres régionaux Symfony2 sur l'itinéraire

J'ai essayé {{path ('myroute', {'_locale': _locale})}} mais l'erreur "Variable" _locale "n'existe pas".

Une idée?

+0

Regardez ceci http://stackoverflow.com/questions/7094728/symfony2-locale-switcher-implementation-without-session-controller –

Répondre

12

Fixé avec {{ path('address', {'_locale': app.request.attributes.get('_locale')}) }} grâce à ce fil http://www.mail-archive.com/[email protected]/msg34838.html.

+0

Comment obtenir le _locale 'par défaut'? {'_locale': defaults_locale}? Parce que l'anglais est défini comme ceci dans mes paramètres de routage: préfixe:/{_ locale} par défaut: _locale: en – Zagloo

+0

@Zagloo J'ai peur de ne pas comprendre votre question. S'il vous plaît envisager de l'expliquer mieux ou ouvrir une nouvelle question avec une description détaillée de votre problème. – umpirsky

3

Deux pages:

localhost.lo/xx/about

localhost.lo/xx/bonjour/{name}

où xx - plusieurs endroits décrits dans 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> 
+1

exigences ne fonctionne pas avec l'itinéraire importé (ressource) ... alors faites attention que local peut être n'importe quoi pour ces routes! –

2

notation sténographique:

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

En Symfony2.1 les paramètres régionaux sont stockés dans la demande, de sorte que vous devez utiliser:

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