2017-06-19 5 views
0

Als ich die Dokumentation von symfony 3 gelesen habe, bin ich sehr verwirrt, und ich bin mir nicht sicher, ob ich alles richtig mache. Dies ist, wie einer meiner normalen Controller auf den Start schaute:Mehrsprachige Option zu einem symfony hinzufügen 3 Projekt

class IndexController extends Controller 

    { 
     /** 
     * @Route("/", name="index") 
     */ 
     public function indexAction(Request $request) 
     { 
      $articles = $this->getDoctrine() 
       ->getRepository(Article::class)->findAll(); 

      return $this->render("index.html.twig", array(
       'articles' => $articles 
      )); 
     } 
    } 

Ich wollte Option für Multi-Sprache hinzufügen. Vor Symfony habe ich gesehen, dass ich die Sprache einfach speichern konnte, und einen Knopf, um sie zu ändern. In symfony habe ich einen translations Ordner und eine Datei für jede Sprache hinzugefügt.

//messages.en.yml 
    base.menu.1: Home 
    base.menu.2: Products 
    base.menu.3: Brands 

//messages.bg.yml 
    base.menu.1: Начало 
    base.menu.2: Продукти 
    base.menu.3: Марки 

Danach ich in einigen titorial sah, dass ich meine _locale wie diese, in meiner Route hinzufügen:
@Route ("{_ locale} /" name = "index")
Und das hat tatsächlich funktioniert. Meine ich konnte die Sprache meiner Homepage ändern, indem ich in bg /, oder en/ging.
Aber das Gebietsschema variabe wurde nirgendwo gespeichert. Wenn ich zu einer anderen Seite gegangen bin, weiß ich nicht, welche Sprache vorher eingestellt wurde. Also las ich mehr, und war ich dieses Problem beheben kann, indem alle meine Routen in routing.yml wie folgt zu speichern:

index: 
    path:  /{_locale}/ 
    defaults: { _controller: AppBundle:Index:index } 
    requirements: 
     _locale: '%app.locales%' 

einzusetzen und dann meine config:

parameters: 
    locale: bg 
    app.locales: bg|en 

framework: 
    translator: { fallbacks: ['%locale%'] } 

All diese funktioniert, außer ich muss mein Routing von ihren Controllern zu routing.yml verschieben. Ich möchte fragen, ob dies die richtige Methode ist, um all dies zu tun, weil ich nicht sicher bin, dass die Dokumentation nicht 100% klar ist (höchstwahrscheinlich kann ich es einfach nicht verstehen) und kann keine guten Titorials finden .

Antwort

0

Verwendung der 'make locale sticky' Verfahren, wie oben erwähnt,

legen Sie dann die locale mit

$request->setLocale($locale); 
$request->getSession()->set('_locale', $locale); 

//now redirect as the locale change will take affect on the next pageload 

(beide gesetzt und Redirect)

+0

Das war es, danke! – symfonypleb

0

Ob durch Annotation oder durch Konfiguration in YAML, das Endergebnis ist das gleiche. Sie werden in eine Debatte von für/gegen Anmerkungen geraten, wenn Sie nicht vorsichtig sind, und ich werde einfach weitermachen und sagen, dass ich sie nicht persönlich empfehle. Ihr routing.yml Ansatz ist der Ansatz, den ich empfehlen würde, und sollte perfekt funktionieren.

0

Ich glaube, dass Sie Symfony Post auf How to Work with the User's Locale gelesen haben und was Sie suchen, ist Making the Locale "Sticky" during a User's Session.

Symfony speichert die locale in dem Antrag Einstellung, was bedeutet, dass diese Einstellung nicht automtically gespeichert wird („sticky“) über Anfragen. Sie können das Gebietsschema jedoch in der Sitzung speichern, sodass es bei nachfolgenden Anforderungen verwendet wird.

+0

So habe ich den Kernel Event Teilnehmer und ich berühre nicht die URL, aber es scheint, dass ich die Sprache nur ändern kann von: public function __construct ($ defaultLocale = '') Ich versuchte mit $ request-> setLocale ('bg'); in meinem Controller, nur um zu testen, und es tatsächlich das Gebietsschema ändert, kann ich dies durch $ request-> getLocale(); sehen, aber es ändert nicht die Sprache der Seite. Ich denke, ich mache es zu spät und es ist bereits eingestellt. Oder ich mache es falsch. Was ist der richtige Weg, um die Sprache von hier zu ändern? – symfonypleb

Verwandte Themen