vendor/symfony/framework-bundle/Translation/Translator.php line 129

  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.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 Symfony\Bundle\FrameworkBundle\Translation;
  11. use Psr\Container\ContainerInterface;
  12. use Symfony\Component\Config\Resource\DirectoryResource;
  13. use Symfony\Component\Config\Resource\FileExistenceResource;
  14. use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
  15. use Symfony\Component\Translation\Exception\InvalidArgumentException;
  16. use Symfony\Component\Translation\Formatter\MessageFormatterInterface;
  17. use Symfony\Component\Translation\Translator as BaseTranslator;
  18. /**
  19.  * @author Fabien Potencier <fabien@symfony.com>
  20.  */
  21. class Translator extends BaseTranslator implements WarmableInterface
  22. {
  23.     protected $container;
  24.     protected $loaderIds;
  25.     protected $options = [
  26.         'cache_dir' => null,
  27.         'debug' => false,
  28.         'resource_files' => [],
  29.         'scanned_directories' => [],
  30.         'cache_vary' => [],
  31.     ];
  32.     /**
  33.      * @var list<string>
  34.      */
  35.     private array $resourceLocales;
  36.     /**
  37.      * Holds parameters from addResource() calls so we can defer the actual
  38.      * parent::addResource() calls until initialize() is executed.
  39.      *
  40.      * @var array[]
  41.      */
  42.     private array $resources = [];
  43.     /**
  44.      * @var string[][]
  45.      */
  46.     private array $resourceFiles;
  47.     /**
  48.      * @var string[]
  49.      */
  50.     private array $scannedDirectories;
  51.     /**
  52.      * @var string[]
  53.      */
  54.     private array $enabledLocales;
  55.     /**
  56.      * Constructor.
  57.      *
  58.      * Available options:
  59.      *
  60.      *   * cache_dir:      The cache directory (or null to disable caching)
  61.      *   * debug:          Whether to enable debugging or not (false by default)
  62.      *   * resource_files: List of translation resources available grouped by locale.
  63.      *   * cache_vary:     An array of data that is serialized to generate the cached catalogue name.
  64.      *
  65.      * @throws InvalidArgumentException
  66.      */
  67.     public function __construct(ContainerInterface $containerMessageFormatterInterface $formatterstring $defaultLocale, array $loaderIds = [], array $options = [], array $enabledLocales = [])
  68.     {
  69.         $this->container $container;
  70.         $this->loaderIds $loaderIds;
  71.         $this->enabledLocales $enabledLocales;
  72.         // check option names
  73.         if ($diff array_diff(array_keys($options), array_keys($this->options))) {
  74.             throw new InvalidArgumentException(sprintf('The Translator does not support the following options: \'%s\'.'implode('\', \''$diff)));
  75.         }
  76.         $this->options array_merge($this->options$options);
  77.         $this->resourceLocales array_keys($this->options['resource_files']);
  78.         $this->resourceFiles $this->options['resource_files'];
  79.         $this->scannedDirectories $this->options['scanned_directories'];
  80.         parent::__construct($defaultLocale$formatter$this->options['cache_dir'], $this->options['debug'], $this->options['cache_vary']);
  81.     }
  82.     /**
  83.      * @return string[]
  84.      */
  85.     public function warmUp(string $cacheDir): array
  86.     {
  87.         // skip warmUp when translator doesn't use cache
  88.         if (null === $this->options['cache_dir']) {
  89.             return [];
  90.         }
  91.         $localesToWarmUp $this->enabledLocales ?: array_merge($this->getFallbackLocales(), [$this->getLocale()], $this->resourceLocales);
  92.         foreach (array_unique($localesToWarmUp) as $locale) {
  93.             // reset catalogue in case it's already loaded during the dump of the other locales.
  94.             if (isset($this->catalogues[$locale])) {
  95.                 unset($this->catalogues[$locale]);
  96.             }
  97.             $this->loadCatalogue($locale);
  98.         }
  99.         return [];
  100.     }
  101.     public function addResource(string $formatmixed $resourcestring $localestring $domain null)
  102.     {
  103.         if ($this->resourceFiles) {
  104.             $this->addResourceFiles();
  105.         }
  106.         $this->resources[] = [$format$resource$locale$domain];
  107.     }
  108.     protected function initializeCatalogue(string $locale)
  109.     {
  110.         $this->initialize();
  111.         parent::initializeCatalogue($locale);
  112.     }
  113.     /**
  114.      * @internal
  115.      */
  116.     protected function doLoadCatalogue(string $locale): void
  117.     {
  118.         parent::doLoadCatalogue($locale);
  119.         foreach ($this->scannedDirectories as $directory) {
  120.             $resourceClass file_exists($directory) ? DirectoryResource::class : FileExistenceResource::class;
  121.             $this->catalogues[$locale]->addResource(new $resourceClass($directory));
  122.         }
  123.     }
  124.     protected function initialize()
  125.     {
  126.         if ($this->resourceFiles) {
  127.             $this->addResourceFiles();
  128.         }
  129.         foreach ($this->resources as $params) {
  130.             [$format$resource$locale$domain] = $params;
  131.             parent::addResource($format$resource$locale$domain);
  132.         }
  133.         $this->resources = [];
  134.         foreach ($this->loaderIds as $id => $aliases) {
  135.             foreach ($aliases as $alias) {
  136.                 $this->addLoader($alias$this->container->get($id));
  137.             }
  138.         }
  139.     }
  140.     private function addResourceFiles(): void
  141.     {
  142.         $filesByLocale $this->resourceFiles;
  143.         $this->resourceFiles = [];
  144.         foreach ($filesByLocale as $files) {
  145.             foreach ($files as $file) {
  146.                 // filename is domain.locale.format
  147.                 $fileNameParts explode('.'basename($file));
  148.                 $format array_pop($fileNameParts);
  149.                 $locale array_pop($fileNameParts);
  150.                 $domain implode('.'$fileNameParts);
  151.                 $this->addResource($format$file$locale$domain);
  152.             }
  153.         }
  154.     }
  155. }