2014-10-29 6 views
2

Я решил установить "gedmo/doctrine-extensions" на Symfony, чтобы использовать Translatable.Gedmo Translatable игнорирует стандартную локаль, установленную в config

Он отлично работает, за исключением того, что слушатель игнорирует стандартную локаль, которую я указал, всегда отступая до en_US.

Translatable подключен как сервис:

#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); 

Это gi ves желаемый перевод.

Есть ли способ установить языковой стандарт по умолчанию, который будет работать?

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, [ "ру"]]' с ру в кавычках – Chausser

+0

@Chausser, отрицательный. Тот же результат. – Nevertheless

+0

какая версия расширений доктрины вы используете? – Chausser

ответ

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

+0

@Chausser, спасибо за подробный ответ, это мне очень помогло. Кстати, вы можете использовать 'ContainerAwareTrait' Symfony, чтобы избежать объявления поля' container' и 'setContainer'. –

Смежные вопросы