2016-10-11 3 views
1

Я использую перевод с учением в проекте Symfony. Я смог добавить переводную сущность и сохранить переведенные тексты, но когда я меняю язык на веб-сайте, тексты не отображаются, хотя, если я перебираю переводы, я могу видеть тексты. Я думаю, что чего-то не хватает.Doctrine Translatable, не отображающий переведенный текст на изменение локали

Twig код:

<p>Title: {{ course.getTitle() }}</p> 
<p>Translations content:</p> 
<ul> 
    {% for t in course.getTranslations() %} 
     <li>{{ t.getLocale() }}: {{ t.getContent() }}</li> 
    {% endfor %} 
</ul> 

выход, если я иду/ан/URL является:

Title: my title in en 
Translations content: 
es: Mi titulo en ES 

Но если я пойду в/эс/URL:

Title: 
Translations content: 
es: Mi titulo en ES 

Вы можете видеть, что перевод es существует, но не отображается при вызове getTitle.

У меня есть объект курса и объект курса CourseTranslation для хранения переводов.

Также я добавил слушателя, чтобы установить локаль по умолчанию и проверить, что выполняется. Код

<?php 
namespace AppBundle\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()); 
    } 
} 

курс:

/** 
* Course 
* 
* @ORM\Table(name="course") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\CourseRepository") 
*/ 
class Course implements Translatable 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @Gedmo\Translatable 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    private $title; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="CourseTranslation", 
    * mappedBy="object", 
    * cascade={"persist", "remove"} 
    *) 
    */ 
    private $translations; 

    /** 
    * Get title 
    * 
    * @return string 
    */ 
    public function getTitle() 
    { 
     return $this->title; 
    } 
    ... 


    /** Translatable operations */ 
    public function getTranslations() 
    { 
     return $this->translations; 
    } 

    public function addTranslation(CourseTranslation $t) 
    { 
     if (!$this->translations->contains($t)) { 
      $this->translations[] = $t; 
      $t->setObject($this); 
     } 
    } 
} 

CourseTranslation код:

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Translatable\Entity\MappedSuperclass\AbstractPersonalTranslation; 

/** 
* @ORM\Entity 
* @ORM\Table(name="course_translations", 
*  uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={ 
*   "locale", "object_id", "field" 
*  })} 
*) 
*/ 
class CourseTranslation extends AbstractPersonalTranslation 
{ 
    /** 
    * Convenient constructor 
    * 
    * @param string $locale 
    * @param string $field 
    * @param string $value 
    */ 
    public function __construct($locale, $field, $value) 
    { 
     $this->setLocale($locale); 
     $this->setField($field); 
     $this->setContent($value); 
    } 

    /** 
    * @ORM\ManyToOne(targetEntity="Course", inversedBy="translations") 
    * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $object; 
} 

услуги YML код:

services: 
    extension.listener: 
     class: AppBundle\Listener\DoctrineExtensionListener 
     calls: 
      - [ setContainer, [ "@service_container" ] ] 
     tags: 
      # translatable sets locale after router processing 
      - { name: kernel.event_listener, event: kernel.request, method: onLateKernelRequest, priority: -10 } 

    gedmo.listener.translatable: 
     class: Gedmo\Translatable\TranslatableListener 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 
     calls: 
      - [ setAnnotationReader, [ "@annotation_reader" ] ] 
      - [ setDefaultLocale, [ %locale% ] ] 
      - [ setTranslationFallback, [ false ] ] 

ответ

0

Хорошо, проблема найдена.

В классе Entity я пропустил @Gedmo\TranslationEntity так что моя организация должна быть:

/** 
* Course 
* 
* @ORM\Table(name="course") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\CourseRepository") 
* @Gedmo\TranslationEntity(class="CourseTranslation") 
*/ 
class Course implements Translatable 

@systemasis, я не знаю, если вы указывали это в вашем примере.

0

С Symfony на версии 2.7.11, я добавил следующее строки, чтобы сделать работу с переводом

use Gedmo\Mapping\Annotation as Gedmo; 

/** 
    * MyEntity 
    * 
    * @ORM\Table(name="myEntity") 
    * @ORM\Entity(repositoryClass="AppBundle\Repository\MyEntityRepository") 
    * @Gedmo\TranslationEntity(class="AppBundle\Entity\MyEntityTranslation") 
    */ 
class MyEntity{ 

     /** 
     * @ORM\OneToMany(
     * targetEntity="AppBundle\Entity\MyEntityTranslation", 
     * mappedBy="object", 
     * cascade={"persist", "remove"} 
     *) 
     * @Copy\Collection 
     */ 
     private $translations; 

     public function setTranslatableLocale($locale){ 
      $this->locale = $locale; 
     } 

     public function getTranslations(){ 
      return $this->translations; 
     } 

     public function addTranslation(MyEntityTranslation $t){ 
      if (!$this->translations->contains($t)) { 
       $this->translations[] = $t; 
       $t->setObject($this); 
      } 
     } 

     public function setTranslations($translations){ 
      foreach($translations as $t){ 
       $this->addTranslation($t); 
      } 
    } 

     public function findTranslation($locale, $field){ 
      $id = $this->id; 
      $existingTranslation = $this->translations ? $this->translations->filter(
       function($object) use ($locale, $field, $id) { 
        return ($object && ($object->getLocale() === $locale) && ($object->getField() === $field)); 
      })->first() : null; 
      return $existingTranslation; 
     } 

     /** 
     * Remove translation 
     * 
     * @param AppBundle\Entity\MyEntityTranslation $translation 
     */ 
     public function removeTranslation(MyEntityTranslation $translation) 
     { 
      $this->translations->removeElement($translation); 
     } 
} 

Мой класс перевода выглядит так же, как ваш. Надеюсь, это помогло.

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