【问题标题】:Symfony : sticky locale doesnt workSymfony:粘性语言环境不起作用
【发布时间】:2017-04-03 08:55:15
【问题描述】:

我正在尝试按照 Symfony 教程中的“在用户会话期间使区域设置“粘滞””,但是我遇到了一个错误,我不知道为什么...

当我单击一个标志来更改语言时,新语言会在会话中设置,并且在重定向之后,我在“$request->getLocale()”中获得了所选语言但不在翻译器...你知道这个问题吗?非常感谢!

编辑:我只想按会话使用语言环境

LocaleListener.php

<?php
// src/AppBundle/EventListener/LocaleListener.php
namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

    public function __construct($defaultLocale = 'fr')
    {
        $this->defaultLocale = $defaultLocale;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            return;
        }

        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            // Si aucune locale n'a été fixée explicitement dans la requête, on utilise celle de la session
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered after the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

change_language.html.twig(更改语言)

<a href="{{ path('app_change_language', {'language': key}) }}" >key</a>

语言控制器.php

<?php

namespace AppBundle\Controller;

use AppBundle\Form\Model\Language\Language;
use AppBundle\Form\Type\LanguageType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;

/**
 * Class LanguageController.
 */
class LanguageController extends AbstractController
{
    /**
     * @Route("/changelanguage/{language}", name="app_change_language", options={"expose"=true})
     *
     * @param Request $request
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function setLanguageAction(Request $request, $language = null)
    {

        $defaultLanguage = $request->getLocale();

        // pour test
        $languages = [
            'fr' => 'French',
            'gb' => 'English',
            'es' => 'Spanish',

        ];

        if(isset($language))
        {


            $this->get('session')->set("_locale", $language);

            $url = $this->generateUrl('app_homepage');
            return $this->redirect($url);

        }

        return $this->render('AppBundle:Language:change_language.html.twig',  array(
                   'languages' => $languages,
                   'defaultLanguage' => $defaultLanguage)
                );
    }
}

app/config/services.xml

  app.eventListeners.locale_listener:
      class: AppBundle\EventListener\LocaleListener
      arguments: ["%kernel.default_locale%"]
      tags:
          - { name: kernel.event_subscriber }

【问题讨论】:

  • 感谢 Fracsi,但它不起作用。即使我在我的 defaultController.php 中使用“$request->getLocale()”中的语言环境强制它,翻译器也会使用默认语言环境。
  • 我不知道我做错了什么:(
  • 我发现了一些有趣且非常奇怪的东西。在 TranslatorListener(setLocale 方法,symfony 源)中,语言环境是好的。这怎么可能 ? TranslatorListener 具有良好的语言环境,但它仍然是使用的错误翻译文件...... ???
  • 最后,我找到了原因...翻译器获得了良好的语言环境,但每次都被外部捆绑包(lexik 翻译)替换...现在它可以工作了!

标签: php symfony


【解决方案1】:

按照 Fracsi 的回答:

默认控制器:

<?php 

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;

    /**
     * Class DefaultController.
     */
    class DefaultController extends AbstractController
    {

        /**
         * @Route("/", name="app_homepage")
         *
         * @param Request $request
         *
         * @return \Symfony\Component\HttpFoundation\Response
         */
        public function indexAction(Request $request)
        {
            $locale     = $request->getLocale();
            // locale = "gb" (after click on the flag and redirect)

            $translator = $this->get('translator');

            var_dump($translator->getLocale()); // fr

            $this->get('translator')->setLocale('gb');

            var_dump($this->get('translator')->getLocale()); // display "gb"
            var_dump($translator->trans('menu.home')); // display translation in french...

        }

【讨论】:

    【解决方案2】:

    答案在这里:

    最后,我找到了原因……翻译器获得了良好的语言环境,但每次都被外部捆绑包(lexik 翻译)替换……现在它可以工作了!

    【讨论】:

    • 你是怎么解决这个问题的?我有完全相同的问题,我使用相同的包,但我真的不知道要避免 lexik 更改本地
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2018-09-22
    相关资源
    最近更新 更多