2016-04-15 6 views
0

Situation

ich auf einem Zuhörer auf kernel.request wie diese hören locale bin Einstellung:Symfony2 locale für Basis Zweig Vorlage ignoriert

<?php 
// ... 
class LocaleListener 
{ 
    //... 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     if (!$event->isMasterRequest()) { 
      return; 
     } 

     // [...] some logic to get $locale 
     $request->setLocale($locale); 
    } 
} 
?> 

Dann habe ich zwei Zweig-Vorlagen, eine Basis und einen Base- Erweiterungs-Vorlage Basisvorlage (base.html.twig):

<html> 
<body> 
    {{ 'some.translation'|trans({}, 'messages') }} 

    {% block body %}{% endblock %} 
</body> 
</html> 

und die Basis erstreckenden-Vorlage (profile.html.twig):

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

{% block body %} 
    {{ 'some.translation'|trans({}, 'messages') }} 
{% endblock %} 

Der Controller der Route wird profile.html.twig machen:

<?php 
// ... 
class SomeController extends Controller 
{ 
    //... 
    public function someAction() 
    { 
     return $this->render('::profile.html.twig'); 
    } 
} 
?> 

Nichts besonderes, alles sehr einfach ...

Problem

Die gerenderte Vorlage, die die Basis erweitert (profile.html.twig), verwendet das Gebietsschema für die im Listener eingestellte Übersetzung. Leider ist die Basisvorlage (base.html.twig) NICHT. Selbst wenn ich {{ dump(app.request.locale) }} auf der Basisvorlage dump, zeigt es das korrekte Gebietsschema im Hörer eingestellt ...

Was vermisse ich?


bearbeiten

Oh, und ich bin mit Symfony v2.7.11.

+1

Könnte es ein Cache-Problem sein? Vielleicht versuchen Sie, 'app/cache/dev' und/oder' app/cache/prod' zu löschen. Überprüfen Sie in Bezug auf das Gebietsschema die Ereignispriorität. [Erstellen eines LocaleListener] (http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html#creating-a-locallistener) besagt, dass Sie hier besonders vorsichtig sein müssen (siehe Zeile 36). – Yoshi

+0

über die Priorität: Ihr Listener muss nach 'LocaleListener' und' TranslatorListener' registriert sein, also '<= 9' – Federkun

Antwort

1

Arbeitslösung: Erstellt den LocaleListener genau wie dokumentiert here (Hinweis von Yoshi).

Nachtrag: Ich wollte das Gebietsschema in Benutzer des Unternehmens gespeichert verwendet werden, so hatte ich eine InteractiveLoginListener (class file) zu erstellen. Ab Version 1.3.6 gibt es (wie 2,0-alpha, obwohl nicht dokumentiert) ein Ereignis genannt security.interactive_login die injiziert werden mußten:

app.interactive_login_listener: 
    class: AppBundle\EventListener\Security\InteractiveLoginListener 
    arguments: ['@fos_user.user_manager', '@session'] 
    tags: 
     - { name: 'kernel.event_listener', event: 'security.interactive_login', method: 'onSecurityInteractiveLogin' }