【问题标题】:Symfony can't set locale to undefinedSymfony 无法将语言环境设置为未定义
【发布时间】:2018-04-24 20:23:07
【问题描述】:

我正在尝试在 Symfony 2.7 项目中使用语言环境。 如果用户未通过身份验证,我想将语言环境设置为$request->getPreferredLanguage(),如果用户通过身份验证并设置了他的首选语言环境,我想将其设置为$user->getLocale()

我读过类似这样的不同帖子:https://gist.github.com/Dattaya/1670163/450a8054d84b30c16174a75eb60f139e2602cdea 但我在setLocaleForUnauthenticatedUser() 中遇到问题,因为我无法将语言环境设置为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());
    }
}

在此代码中,$request->getLocale() 不是undefined,而是en。 我不明白为什么。有人可以帮帮我吗?

【问题讨论】:

  • 您在parameters 下的locale 行实际上是否正确缩进?因为现在贴出来,不是parameters下的孩子
  • 抱歉,这是一个错误的复制/粘贴,但在我的文件中缩进得很好
  • 如果你在 config.yml 中设置 fr 而不是 "undefined" 会发生什么?将 $request->getLocale() "en" 吗?
  • 我试过了,文件里写了“en”,但是网站是法语的(选择法语翻译)
  • 会不会是优先级的原因?这很奇怪,因为当我将语言环境设置为未定义时,找到了任何翻译(网站充满了翻译键),当我将其设置为法语时,网站是法语的。似乎考虑了语言环境变量但不在$request->getLocale()

标签: php symfony listener locale


【解决方案1】:

最后我找到了解决方案: config.yml文件

parameters:
    locale: "undefined"

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

services.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->getSession()->get('_locale'); 是否为空。这是用户仍未登录的情况。当用户登录时,会调用setLocaleForAuthenticatedUser 方法,我们将会话区域设置为用户首选区域。 请注意,子字符串用于防止准确的语言环境出现问题,例如 fr_FR 它可能会更好,但这是一个可行的解决方案

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 2012-12-25
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多