当前位置: 首页 > 知识库问答 >
问题:

Symfony区域设置在布局中不可用

孙莫希
2023-03-14

我试图在Symfony中设置一个区域设置,除了我试图在布局文件中翻译或生成路线的地方,一切都很好。我创建了一个侦听器,这样我就可以在每个请求上设置区域设置。

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

class LocaleListener implements EventSubscriberInterface {

private $container;
private $defaultLocale;

public function __construct(ContainerInterface $container, $defaultLocale = 'en') {
    $this->container = $container;
    $this->defaultLocale = $defaultLocale;
}

public function onKernelRequest(GetResponseEvent $event) {
    $request = $event->getRequest();
    if (!$request->hasPreviousSession()) {
        return;
    }
    // try to see if the locale has been set as a _locale routing parameter

    $loc = $this->defaultLocale;
    if ($locale = $request->attributes->get('_locale')) {
        //$request->getSession()->set('lang', $locale);
        $event->getRequest()->getSession()->set('_locale', $locale);
        $event->getRequest()->setLocale($locale);
        $loc = $locale;
    } else {
        // if no explicit locale has been set on this request, use one from the session
        $request->setLocale($this->defaultLocale);
        $event->getRequest()->getSession()->set('_locale', $this->defaultLocale);
        $loc = $this->defaultLocale;
    }

    $this->container->get('translator')->setLoc($loc);
}

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

}

如果在树枝模板中,我试图使用app.session.get('_locale')访问会话变量,该变量存储了它应该是的语言环境-我得到了所需的结果。但是当我尝试app.request.locale我得到默认的语言环境,而不是在网址。正因为如此,我的所有路由都以默认语言环境为前缀,所有内容都以默认语言翻译。如何从我的布局中的url获取区域设置并生成路由和翻译?

共有1个答案

宰父衡
2023-03-14

您可能应该只使用一种方法来处理区域设置转换。

我实施了这个行动

/**
     * @Route("/{_locale}")
     */

$request->setLocale('en');
$request->getSession()->set('_locale','fr');
$localesArray = [
            'request' => $request->getLocale(),
            'request_default' => $request->getDefaultLocale(),
            'config_default' => $this->getParameter('kernel.default_locale'),
            'session_locale' => $request->getSession()->get('_locale'),
            'request_attributes' => $request->attributes->get('_locale')
        ];



        var_dump($localesArray);
        die();

答案是这个

array(5) { 
["request"]=> string(2) "en" 
["request_default"]=> string(2) "nl" 
["config_default"]=> string(2) "nl" 
["session_locale"]=> string(2) "fr" 
["request_attributes"]=> string(2) "es" 
} 

正如您所看到的,当我通过setLocale更改区域设置时,并没有影响其他结果。我得到的结果访问这个url"/es"和我的默认语言环境为"nl"。比较结果

我的建议:仅使用此文档描述的请求区域设置

 类似资料:
  • 我安装了三个区域设置捆绑包: JMSi18nRoutingBundle 我的如下所示: 一切都按我的喜好工作,除了我在日志中发现了一个错误: 在堆栈中我发现:的区域设置,但是,我不明白如何将区域设置设置为“en_US”。 我想它来自于对Lunetics的猜测,但是有“en_US”的人应该匹配“en”,而不是“en_US”。 我的主要问题是,我不知道如何跟踪这一点。当我用自己的设置连接到主页时,首先

  • 我创建了一个控制器,根据加密的GET参数手动设置安全令牌。我使用它来创建一个远程登录URL,当用户遵循此链接时,该URL将执行登录。 现在我想添加区域设置。当提供了朗参数时,它应该设置区域设置。我添加了这个到我的控制器: 正在根据开发栏将_locale变量设置到设置中。但是,未加载语言文件,它将返回默认语言。 我读过关于创建监听器来实现这一点的文章,但是在我看来,当你想在网址中提供语言时,这是有用

  • 我想强制我的Symfony 2.5应用程序的区域设置为。我希望这个区域设置用于strftime()函数。 我的: 我正在我的一个控制器中使用以下代码来调试: 当这样执行时,它显示:。 但是,当第一行未注释时,它会显示:,因此区域设置已安装在系统中并正常工作。 我如何使Symfony始终使用配置中指定的语言环境? $locale-a:

  • 我刚开始使用symfony,我正在尝试建立一个multilang网站,但是我在更改区域设置时遇到了一个问题 我读了一些帖子,也读了相关文档,但语言环境没有改变,我尝试: 但是$locale中的值总是'en'(我的默认语言环境) 我也试试 在本例中,$locale是fr,但翻译总是来自消息。ENyml 我想第一次使用$\u SERVER['HTTP\u ACCEPT\u LANGUAGE']检测用户

  • 我需要能够定义部分是可选的路由。这意味着我需要这些URL使用相同的控制器: (语言环境将由请求侦听器设置) 这同样适用于: 问题是我不能定义两个class注释,因为这是无效的/Symfony不接受的;我不能在我的控制器类中复制每一条路由,因为会有大量的路由,这将非常糟糕! 我尝试过只使用一个类注释,但无法使其正常工作。以下是我的尝试: 结论: 作品 作品 失败(因为只有可以工作) 工作 我以为问题

  • 我正在尝试在Symfony 2.7项目中使用locale。我想将区域设置设置为