2016-10-11 16 views
1

symfonyプロジェクトでdoctrineとtranslatableを使用しています。私は翻訳可能なエンティティを追加して翻訳されたテキストを格納することができましたが、ウェブサイトのロケールを変更すると、テキストは表示されませんが、翻訳を繰り返してテキストを見ることができます。私は何かが足りないと思う。Doctrine Translatableがロケール変更で翻訳されたテキストを表示しない

小枝コード:

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

出力は、私は/ EN/URLに行けば次のとおりです。

Title: 
Translations content: 
es: Mi titulo en ES 

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

しかし、私は、/ ES/URLに行けばes変換がそこにあるのがわかりますが、getTitleが呼び出されると表示されません。

翻訳を保存するCourseエンティティと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コード:symfonyで

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

問題が見つかりました。私は@Gedmo\TranslationEntityを逃したEntityクラスで

ので、私のエンティティがなければならない:あなたはあなたの例でこれを指していた場合

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

@systemasis、私は知りません。

0

バージョン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); 
     } 
} 

私の翻訳クラスはあなたと同じように見えます。それが助けてくれたらと思います。

関連する問題