Как отобразить сообщение в локали по умолчанию, когда сообщение недоступно в текущей локали? Презент Переводы - PullRequest
1 голос
/ 08 июля 2019

Я работаю на многоязычном веб-сайте, используя пакет 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 }}

.. решит, но я также уверен, что пакет "недоступен для этой локали" поддерживается пакетом.

Ты хоть представляешь, что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...