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

Symfony无法将区域设置为未定义

单于季
2023-03-14

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

我读过不同的帖子,比如:https://gist.github.com/Dattaya/1670163/450a8054d84b30c16174a75eb60f139e2602cdea但是我在setLocaleForRunAuthenticatedUser()中遇到了一个问题,因为我无法将区域设置设置为undefined

这是我的config.yml文件:

parameters:
locale: "undefined"
session:
    storage:
        options:
            name: app_sess
framework:
    translator:      { fallback: "undefined" }
    default_locale:  "%locale%"
    secret:          "%secret%"

我定义了服务:

acme.locale.interactive_login_listener:
    class: acme\GeneralBundle\EventListener\LocaleListener
    calls:
        - [ setSession, [@session] ]
    tags:
        - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }

acme.locale.kernel_request_listener:
    class: acme\GeneralBundle\EventListener\LocaleListener
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser, priority: 17 }

下面是方法:

public function setLocaleForUnauthenticatedUser(GetResponseEvent $event)
{
    if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
        return;
    }

    $request = $event->getRequest();
    file_put_contents('test.txt', $request->getLocale(), FILE_APPEND);
    if ($request->getLocale() === 'undefined' ) {
        $request->setLocale($request->getPreferredLanguage());
    }
}

在此代码$请求-


共有1个答案

华煜祺
2023-03-14

最后我找到了一个解决方案:config.ymlfile

parameters:
    locale: "undefined"

framework:
    translator:      { fallback: "en" }
    default_locale:  "%locale%"

服务。yml文件

acme.locale.interactive_login_listener:
    class: acme\GeneralBundle\EventListener\LocaleListener
    calls:
        - [ setSession, [@session] ]
    tags:
        - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }

acme.locale.kernel_request_listener:
    class: acme\GeneralBundle\EventListener\LocaleListener
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser, priority: 10 }

LocaleListener文件

class LocaleListener {

public function setSession(Session $session)
{
    $this->session = $session;
}


public function setLocaleForUnauthenticatedUser(GetResponseEvent $event)
{
    if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
        return;
    }

    $request = $event->getRequest();
    $sessionLocale = $request->getSession()->get('_locale');
    if ($sessionLocale == '') {
        $request->setLocale(substr($request->getPreferredLanguage(), 0, 2));
    } else {
        $request->setLocale(substr($sessionLocale, 0, 2));
    }
}


public
function setLocaleForAuthenticatedUser(InteractiveLoginEvent $event)
{
    $user = $event->getAuthenticationToken()->getUser();
    $preferences = $user->getPreferences();

    if ($preferences !== null && gettype($preferences) === 'array' && isset($preferences['language'])) {
        $event->getRequest()->setLocale(substr($preferences['language'], 0, 2));
        $this->session->set('_locale', substr($preferences['language'], 0, 2));
    }
}

}

此解决方案的目的是检查$request-

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

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

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

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

  • 我试图在Symfony中设置一个区域设置,除了我试图在布局文件中翻译或生成路线的地方,一切都很好。我创建了一个侦听器,这样我就可以在每个请求上设置区域设置。 } 如果在树枝模板中,我试图使用app.session.get('_locale')访问会话变量,该变量存储了它应该是的语言环境-我得到了所需的结果。但是当我尝试app.request.locale我得到默认的语言环境,而不是在网址。正因为如

  • 我想更改symfony上所有页面的区域设置。 我尝试了这个: