2014-10-29 46 views
2

我已决定在Symfony上安装"gedmo/doctrine-extensions"以使用TranslatableGedmo Translatable忽略在配置中设置的默认语言环境

它工作正常,除了侦听器忽略我指定的默认语言环境,始终回落到en_US

可翻译被插入的服务:

#config.yml 
services: 
    gedmo.listener.translatable: 
     class: Gedmo\Translatable\TranslatableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 
      - [ setDefaultLocale, [ ru ] ] 
      - [ setTranslationFallback, [ true ] ] 

当我尝试在数据库find()对象时,它总是取en_US而不是ru

$test = $em->find('Vendor\Entity\Test', 1); 
//outputs row with 'locale' = "en_US" from `ext_translations_test` table 

只有当我直接指定语言,如:

$test->setTranslatableLocale('ru'); 
$em->refresh($test); 

It gi预期的翻译。

有什么办法可以设置默认的语言环境吗?

UPDATE

config.yml添加另一个通话功能解决了这一问题,altough现在我不太清楚setDefaultLocale()功能其实呢,作为Gedmo\Translatable\TranslatableListener::$defaultLocale财产提供了我所见过的最可怕的评论。将设法找到更多...

services: 
    gedmo.listener.translatable: 
     class: Gedmo\Translatable\TranslatableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ @annotation_reader ] ] 
      - [ setDefaultLocale, [ ru ] ] 
      - [ setTranslatableLocale, [ ru ] ] 
      - [ setTranslationFallback, [ true ] ] 
+0

试试' - [setDefaultLocale,[ “RU”]]'有鸿儒引号 – Chausser 2014-10-29 17:58:56

+0

@Chausser,负。同样的结果。 – Nevertheless 2014-10-29 18:31:09

+0

您使用的是什么版本的学说扩展? – Chausser 2014-10-29 18:44:26

回答

2

据:https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/symfony2.md

注意:如果你注意到了,还有的Acme \ DemoBundle \监听\ DoctrineExtensionListener你需要,如果你用它来创建这个监听器类可记录或可翻译的行为。此侦听器将设置从请求和用户名使用的语言环境为可登录。因此,要完成设置,请创建Acme \ DemoBundle \ Listener \ DoctrineExtensionListener

确保您已设置内核侦听器。

namespace Acme\DemoBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 

class DoctrineExtensionListener implements ContainerAwareInterface 
{ 
    /** 
    * @var ContainerInterface 
    */ 
    protected $container; 

    public function setContainer(ContainerInterface $container = null) 
    { 
     $this->container = $container; 
    } 

    public function onLateKernelRequest(GetResponseEvent $event) 
    { 
     $translatable = $this->container->get('gedmo.listener.translatable'); 
     $translatable->setTranslatableLocale($event->getRequest()->getLocale()); 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $securityContext = $this->container->get('security.context', ContainerInterface::NULL_ON_INVALID_REFERENCE); 
     if (null !== $securityContext && null !== $securityContext->getToken() && $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 
      $loggable = $this->container->get('gedmo.listener.loggable'); 
      $loggable->setUsername($securityContext->getToken()->getUsername()); 
     } 
    } 
} 

,并添加以下到您的配置文件:

services: 
    extension.listener: 
     class: Acme\DemoBundle\Listener\DoctrineExtensionListener 
     calls: 
      - [ setContainer, [ @service_container ] ] 
     tags: 
      # translatable sets locale after router processing 
      - { name: kernel.event_listener, event: kernel.request, method: onLateKernelRequest, priority: -10 } 
      # loggable hooks user username if one is in security context 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
+0

实际上,在查看'Gedmo \ Translatable \ TranslatableListener'类后,我在'config.yml'中添加了另一个调用函数,它解决了这个问题。您的回答给了我一个想法,请参阅更新。谢谢! – Nevertheless 2014-10-30 08:39:57

+0

@Chausser,谢谢你的详细解答,它帮了我很多。顺便说一句,你可以使用symfony的'ContainerAwareTrait'来避免声明'container'字段和'setContainer'方法。 – 2014-11-27 10:28:28