vendor/knplabs/doctrine-behaviors/src/Model/Translatable/TranslatableMethods.php line 101

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the KnpDoctrineBehaviors package.
  4.  *
  5.  * (c) KnpLabs <http://knplabs.com/>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Knp\DoctrineBehaviors\Model\Translatable;
  11. use Doctrine\Common\Collections\ArrayCollection;
  12. /**
  13.  * Translatable trait.
  14.  *
  15.  * Should be used inside entity, that needs to be translated.
  16.  */
  17. trait TranslatableMethods
  18. {
  19.     /**
  20.      * Returns collection of translations.
  21.      *
  22.      * @return ArrayCollection
  23.      */
  24.     public function getTranslations()
  25.     {
  26.         return $this->translations $this->translations ?: new ArrayCollection();
  27.     }
  28.     /**
  29.      * Returns collection of new translations.
  30.      *
  31.      * @return ArrayCollection
  32.      */
  33.     public function getNewTranslations()
  34.     {
  35.         return $this->newTranslations $this->newTranslations ?: new ArrayCollection();
  36.     }
  37.     /**
  38.      * Adds new translation.
  39.      *
  40.      * @param Translation $translation The translation
  41.      *
  42.      * @return $this
  43.      */
  44.     public function addTranslation($translation)
  45.     {
  46.         $this->getTranslations()->set((string)$translation->getLocale(), $translation);
  47.         $translation->setTranslatable($this);
  48.         return $this;
  49.     }
  50.     /**
  51.      * Removes specific translation.
  52.      *
  53.      * @param Translation $translation The translation
  54.      */
  55.     public function removeTranslation($translation)
  56.     {
  57.         $this->getTranslations()->removeElement($translation);
  58.     }
  59.     /**
  60.      * Returns translation for specific locale (creates new one if doesn't exists).
  61.      * If requested translation doesn't exist, it will first try to fallback default locale
  62.      * If any translation doesn't exist, it will be added to newTranslations collection.
  63.      * In order to persist new translations, call mergeNewTranslations method, before flush
  64.      *
  65.      * @param string $locale The locale (en, ru, fr) | null If null, will try with current locale
  66.      * @param bool $fallbackToDefault Whether fallback to default locale
  67.      *
  68.      * @return Translation
  69.      */
  70.     public function translate($locale null$fallbackToDefault true)
  71.     {
  72.         return $this->doTranslate($locale$fallbackToDefault);
  73.     }
  74.     /**
  75.      * Returns translation for specific locale (creates new one if doesn't exists).
  76.      * If requested translation doesn't exist, it will first try to fallback default locale
  77.      * If any translation doesn't exist, it will be added to newTranslations collection.
  78.      * In order to persist new translations, call mergeNewTranslations method, before flush
  79.      *
  80.      * @param string $locale The locale (en, ru, fr) | null If null, will try with current locale
  81.      * @param bool $fallbackToDefault Whether fallback to default locale
  82.      *
  83.      * @return Translation
  84.      */
  85.     protected function doTranslate($locale null$fallbackToDefault true)
  86.     {
  87.         if (null === $locale) {
  88.             $locale $this->getCurrentLocale();
  89.         }
  90.         $translation $this->findTranslationByLocale($locale);
  91.         if ($translation and !$translation->isEmpty()) {
  92.             return $translation;
  93.         }
  94.         if ($fallbackToDefault) {
  95.             if (($fallbackLocale $this->computeFallbackLocale($locale))
  96.                 && ($translation $this->findTranslationByLocale($fallbackLocale))) {
  97.                 return $translation;
  98.             }
  99.             if ($defaultTranslation $this->findTranslationByLocale($this->getDefaultLocale(), false)) {
  100.                 return $defaultTranslation;
  101.             }
  102.         }
  103.         $class       = static::getTranslationEntityClass();
  104.         $translation = new $class();
  105.         $translation->setLocale($locale);
  106.         $this->getNewTranslations()->set((string)$translation->getLocale(), $translation);
  107.         $translation->setTranslatable($this);
  108.         return $translation;
  109.     }
  110.     /**
  111.      * Merges newly created translations into persisted translations.
  112.      */
  113.     public function mergeNewTranslations()
  114.     {
  115.         foreach ($this->getNewTranslations() as $newTranslation) {
  116.             if (!$this->getTranslations()->contains($newTranslation) && !$newTranslation->isEmpty()) {
  117.                 $this->addTranslation($newTranslation);
  118.                 $this->getNewTranslations()->removeElement($newTranslation);
  119.             }
  120.         }
  121.     }
  122.     /**
  123.      * @param mixed $locale the current locale
  124.      */
  125.     public function setCurrentLocale($locale)
  126.     {
  127.         $this->currentLocale $locale;
  128.     }
  129.     /**
  130.      * @return Returns the current locale
  131.      */
  132.     public function getCurrentLocale()
  133.     {
  134.         return $this->currentLocale ?: $this->getDefaultLocale();
  135.     }
  136.     /**
  137.      * @param mixed $locale the default locale
  138.      */
  139.     public function setDefaultLocale($locale)
  140.     {
  141.         $this->defaultLocale $locale;
  142.     }
  143.     /**
  144.      * @return Returns the default locale
  145.      */
  146.     public function getDefaultLocale()
  147.     {
  148.         return $this->defaultLocale;
  149.     }
  150.     /**
  151.      * An extra feature allows you to proxy translated fields of a translatable entity.
  152.      *
  153.      * @param string $method
  154.      * @param array $arguments
  155.      *
  156.      * @return mixed The translated value of the field for current locale
  157.      */
  158.     protected function proxyCurrentLocaleTranslation($method, array $arguments = [])
  159.     {
  160.         return call_user_func_array(
  161.             [$this->translate($this->getCurrentLocale()), $method],
  162.             $arguments
  163.         );
  164.     }
  165.     /**
  166.      * Returns translation entity class name.
  167.      *
  168.      * @return string
  169.      */
  170.     public static function getTranslationEntityClass()
  171.     {
  172.         return __CLASS__.'Translation';
  173.     }
  174.     /**
  175.      * Finds specific translation in collection by its locale.
  176.      *
  177.      * @param string $locale              The locale (en, ru, fr)
  178.      * @param bool   $withNewTranslations searched in new translations too
  179.      *
  180.      * @return Translation|null
  181.      */
  182.     protected function findTranslationByLocale($locale$withNewTranslations true)
  183.     {
  184.         $translation $this->getTranslations()->get($locale);
  185.         if ($translation) {
  186.             return $translation;
  187.         }
  188.         if ($withNewTranslations) {
  189.             return $this->getNewTranslations()->get($locale);
  190.         }
  191.     }
  192.     protected function computeFallbackLocale($locale)
  193.     {
  194.         if (strrchr($locale'_') !== false) {
  195.             return substr($locale0, -strlen(strrchr($locale'_')));
  196.         }
  197.         return false;
  198.     }
  199. }