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