/**
  * {@inheritdoc}
  */
 public function translate($locale = null)
 {
     $locale = $locale ?: $this->currentLocale;
     if (null === $locale) {
         throw new \RuntimeException('No locale has been set and current locale is undefined.');
     }
     if ($this->currentTranslation && $locale === $this->currentTranslation->getLocale()) {
         return $this->currentTranslation;
     }
     if (!($translation = $this->translations->get($locale))) {
         if (null === $this->fallbackLocale) {
             throw new \RuntimeException('No fallback locale has been set.');
         }
         if (!($fallbackTranslation = $this->translations->get($this->getFallbackLocale()))) {
             $className = $this->getTranslationClass();
             /** @var TranslationInterface $translation */
             $translation = new $className();
             $translation->setLocale($locale);
             $this->addTranslation($translation);
         } else {
             $translation = clone $fallbackTranslation;
         }
     }
     $this->currentTranslation = $translation;
     return $translation;
 }
 /**
  * @param TranslationInterface $translation
  */
 public function addTranslation(TranslationInterface $translation)
 {
     if (!$this->translations->containsKey($translation->getLocale())) {
         $this->translations->set($translation->getLocale(), $translation);
         $translation->setTranslatable($this);
     }
 }