当前消息在当前语言环境中不可用时,如何在默认语言环境中显示消息?出色的翻译

时间:2019-07-08 07:15:03

标签: php symfony translation

我正在使用Prezent捆绑包翻译我的实体的多语言网站上。

实际上,所有语言环境中的输入都有效,但是当在当前语言环境中未定义消息时,我会遇到一些显示消息的问题。

这是我的Category实体的摘录(字段“ name”已翻译):

/**
 * @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 方法位于 TranslatableEntity 中,下面是代码:

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

..可以解决,但我也很确定捆绑包支持“不适用于此语言环境”的情况。

您是否知道我在做什么错?

0 个答案:

没有答案