You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.1 KiB
132 lines
4.1 KiB
<?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 MessageCatalogue $messages |
|
* @param string $domain |
|
* @param array $options |
|
* |
|
* @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(), |
|
]); |
|
} |
|
}
|
|
|