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