Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
digitalascetic/simple-translatable / Service / TranslatableService.php
Size: Mime:
<?php
/**
 * Created by IntelliJ IDEA.
 * User: martino
 * Date: 14/03/16
 * Time: 09:13
 */

namespace DigitalAscetic\SimpleTranslatable\Service;


use DigitalAscetic\SimpleTranslatable\Entity\Translatable;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class TranslatableService
{
    /**
     * TranslatableService constructor.
     * @param ContainerInterface $container
     * @param EntityManager $entityManager
     * @param array $locales
     */
    public function __construct(private ContainerInterface $container, private EntityManagerInterface $entityManager, private array $locales)
    {
    }

    public function getTranslatedLocales(Translatable $entity, $includeSelf = true)
    {
        $source = $entity->getTranslationSource();

        if ($includeSelf) {
            $translatedLocales = array($entity->getLocale());
        } else {
            $translatedLocales = array();
        }

        // Add source locale
        if (($source != $entity)) {
            $translatedLocales[] = $source->getLocale();
        }


        if ($source->getTranslations()) {
            foreach ($source->getTranslations() as $translation) {
                if (!$includeSelf && $translation->getLocale() == $entity->getLocale() || in_array(
                        $translation->getLocale(),
                        $translatedLocales
                    )
                ) {
                    continue;
                }
                $translatedLocales[] = $translation->getLocale();
            }
        }

        return $translatedLocales;

    }

    public function getUntranslatedLocales(Translatable $entity): array
    {
        return array_diff($this->locales, $this->getTranslatedLocales($entity, true));
    }

    /**
     * @return Translatable|null
     */
    public function getTranslation(Translatable $entity, $locale): ?Translatable
    {

        if ($entity->getLocale() == $locale) {
            return $entity;
        }

        if ($entity->getTranslationSource() && $entity->getTranslationSource()->getLocale() == $locale) {
            return $entity->getTranslationSource();
        }

        if ($entity->getTranslationSource()) {
            $translations = $entity->getTranslationSource()->getTranslations();
        } else {
            $translations = $entity->getTranslations();

        }

        /** @var Translatable $translation */
        foreach ($translations as $translation) {
            if ($translation->getLocale() == $locale) {
                return $translation;
            }
        }

        return null;
    }

    /**
     * @return \string[]
     */
    public function getLocales(): array
    {
        return $this->locales;
    }

}