| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\Translation\Dumper;use Symfony\Component\Translation\Exception\InvalidArgumentException;use Symfony\Component\Translation\Exception\RuntimeException;use Symfony\Component\Translation\MessageCatalogue;/** * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s). * * Options: * - path (mandatory): the directory where the files should be saved * * @author Michel Salib <michelsalib@hotmail.com> */abstract class FileDumper implements DumperInterface{    /**     * A template for the relative paths to files.     *     * @var string     */    protected $relativePathTemplate = '%domain%.%locale%.%extension%';    /**     * Sets the template for the relative paths to files.     *     * @param string $relativePathTemplate A template for the relative paths to files     */    public function setRelativePathTemplate($relativePathTemplate)    {        $this->relativePathTemplate = $relativePathTemplate;    }    /**     * Sets backup flag.     *     * @param bool $backup     *     * @deprecated since Symfony 4.1     */    public function setBackup($backup)    {        @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.1.', __METHOD__), \E_USER_DEPRECATED);        if (false !== $backup) {            throw new \LogicException('The backup feature is no longer supported.');        }    }    /**     * {@inheritdoc}     */    public function dump(MessageCatalogue $messages, $options = [])    {        if (!\array_key_exists('path', $options)) {            throw new InvalidArgumentException('The file dumper needs a path option.');        }        // save a file for each domain        foreach ($messages->getDomains() as $domain) {            $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale());            if (!file_exists($fullpath)) {                $directory = \dirname($fullpath);                if (!file_exists($directory) && !@mkdir($directory, 0777, true)) {                    throw new RuntimeException(sprintf('Unable to create directory "%s".', $directory));                }            }            $intlDomain = $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX;            $intlMessages = $messages->all($intlDomain);            if ($intlMessages) {                $intlPath = $options['path'].'/'.$this->getRelativePath($intlDomain, $messages->getLocale());                file_put_contents($intlPath, $this->formatCatalogue($messages, $intlDomain, $options));                $messages->replace([], $intlDomain);                try {                    if ($messages->all($domain)) {                        file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options));                    }                    continue;                } finally {                    $messages->replace($intlMessages, $intlDomain);                }            }            file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options));        }    }    /**     * Transforms a domain of a message catalogue to its string representation.     *     * @param string $domain     *     * @return string representation     */    abstract public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = []);    /**     * Gets the file extension of the dumper.     *     * @return string file extension     */    abstract protected function getExtension();    /**     * Gets the relative file path using the template.     */    private function getRelativePath(string $domain, string $locale): string    {        return strtr($this->relativePathTemplate, [            '%domain%' => $domain,            '%locale%' => $locale,            '%extension%' => $this->getExtension(),        ]);    }}
 |