Я работаю на многоязычном веб-сайте, используя пакет Prezent для перевода моих сущностей.
На самом деле, ввод во всех локалях работает, но у меня есть некоторые проблемы с отображением сообщений, когда они не определены в текущей локали.
Вот выдержка из моей сущности категории (переведено поле "имя"):
/**
* @ORM\Entity(repositoryClass="App\Repository\CategoryRepository")
*/
class Category extends TranslatableEntity
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\OneToMany(targetEntity="CategoryTranslation", mappedBy="translatable", cascade={"persist", "remove"}, indexBy="locale")
*/
protected $translations;
public function __construct()
{
$this->translations = new ArrayCollection();
$this->translationEntity = 'CategoryTranslation';
}
public function getId(){
return $this->id;
}
public function setId($id){
$this->id = $id;
}
public function getName()
{
return $this->translate()->getName();
}
public function setName($name){
$this->translate()->setName($name);
return $this;
}
}
Метод translate находится в TranshableEntity , вот код:
abstract class TranslatableEntity extends AbstractTranslatable
{
/**
* @Prezent\CurrentLocale
*/
protected $currentLocale;
protected $translationEntity;
/**
* Cache current translation. Useful in Doctrine 2.4+
*/
protected $currentTranslation;
public function getCurrentLocale()
{
return $this->currentLocale;
}
public function setCurrentLocale($locale)
{
$this->currentLocale = $locale;
return $this;
}
/**
* Translation helper method
*/
public function translate($locale = null)
{
if (null === $locale) {
$locale = $this->currentLocale;
}
if (!$locale) {
throw new \RuntimeException('No locale has been set and currentLocale is empty');
}
if ($this->currentTranslation && $this->currentTranslation->getLocale() === $locale) {
return $this->currentTranslation;
}
if (!$translation = $this->translations->get($locale)) {
$className=$this->translationEntity;
$translation = new $className;
$translation->setLocale($locale);
$this->addTranslation($translation);
}
$this->currentTranslation = $translation;
return $translation;
}
}
Я использую этот способ для отображения переведенных имен в Twig:
{{ cat.translations.get(app.request.locale).name }}
Это работает, но я уверен, что это не правильный способ сделать это. Более того, метод выдает ошибку, когда я пытаюсь отобразить имя, которое не определено в текущей локали.
Я думаю, что ...
{{ cat.translations.get(app.request.locale).name is defined ? cat.translations.get(app.request.locale).name : cat.translations.get(default_locale).name }}
.. решит, но я также уверен, что пакет "недоступен для этой локали" поддерживается пакетом.
Ты хоть представляешь, что я делаю не так?