2016-10-11 2 views
1

Ich verwende übersetzbare Dokumente in einem Symfony-Projekt. Ich konnte die übersetzbare Entität hinzufügen und übersetzte Texte speichern, aber wenn ich das Gebietsschema auf der Website ändere, werden die Texte nicht angezeigt. Wenn ich jedoch über die Übersetzungen iteriere, kann ich die Texte sehen. Ich denke, ich vermisse etwas.Doctrine Translatable zeigt keinen übersetzten Text in der Gebietsschemaänderung an

Zweig Code:

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

Der Ausgang, wenn ich/en/url gehen:

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

Aber wenn ich gehen/es/url:

Title: 
Translations content: 
es: Mi titulo en ES 

Sie können sehen, dass die es Übersetzung vorhanden ist, aber nicht angezeigt wird, wenn getTitle aufgerufen wird.

Ich habe meine Kurseinheit und CourseTranslation-Einheit, um die Übersetzungen zu speichern.

Auch ich habe den Listener hinzugefügt, um das Standardgebietsschema festzulegen und überprüft, dass gerade ausgeführt wird.

<?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()); 
    } 
} 

Kursnummer:

/** 
* 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 Code:

<?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; 
} 

Dienste yml Code:

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 ] ] 

Antwort

0

Ok, Problem gefunden.

In der Entity-Klasse verpasste ich die @Gedmo\TranslationEntity so mein Wesen zu sein hat:

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

@systemasis, ich weiß nicht, ob Sie diese deuten in Ihrem Beispiel.

0

Mit Symfony auf Version 2.7.11, fügte ich die folgende Linien, um übersetzbare Arbeit zu machen

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

Meine Übersetzungsklasse sieht genauso aus wie Ihre. Hoffe es hat geholfen.