diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index b8027ab12e..467feacd90 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -1,6 +1,12 @@ CHANGELOG ========= +2.5.0 +----- + + * added relative file path template to the file dumpers + * changed IcuResFileDumper to extend FileDumper + 2.3.0 ----- diff --git a/src/Symfony/Component/Translation/Dumper/FileDumper.php b/src/Symfony/Component/Translation/Dumper/FileDumper.php index ffe6017720..5ab20eba5b 100644 --- a/src/Symfony/Component/Translation/Dumper/FileDumper.php +++ b/src/Symfony/Component/Translation/Dumper/FileDumper.php @@ -24,6 +24,23 @@ use Symfony\Component\Translation\MessageCatalogue; */ 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; + } + /** * {@inheritDoc} */ @@ -35,11 +52,15 @@ abstract class FileDumper implements DumperInterface // save a file for each domain foreach ($messages->getDomains() as $domain) { - $file = $domain.'.'.$messages->getLocale().'.'.$this->getExtension(); // backup - $fullpath = $options['path'].'/'.$file; + $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale()); if (file_exists($fullpath)) { copy($fullpath, $fullpath.'~'); + } else { + $directory = dirname($fullpath); + if (!file_exists($directory) && !@mkdir($directory, 0777, true)) { + throw new \RuntimeException(sprintf('Cannot create the directory "%s"', $directory)); + } } // save file file_put_contents($fullpath, $this->format($messages, $domain)); @@ -62,4 +83,21 @@ abstract class FileDumper implements DumperInterface * @return string file extension */ abstract protected function getExtension(); + + /** + * Gets the relative file path using the template. + * + * @param string $domain The domain + * @param string $locale The locale + * + * @return string The relative file path + */ + private function getRelativePath($domain, $locale) + { + return strtr($this->relativePathTemplate, array( + '{domain}' => $domain, + '{locale}' => $locale, + '{extension}' => $this->getExtension() + )); + } } diff --git a/src/Symfony/Component/Translation/Dumper/IcuResFileDumper.php b/src/Symfony/Component/Translation/Dumper/IcuResFileDumper.php index 979153ac22..9d0c6b226a 100644 --- a/src/Symfony/Component/Translation/Dumper/IcuResFileDumper.php +++ b/src/Symfony/Component/Translation/Dumper/IcuResFileDumper.php @@ -18,35 +18,12 @@ use Symfony\Component\Translation\MessageCatalogue; * * @author Stealth35 */ -class IcuResFileDumper implements DumperInterface +class IcuResFileDumper extends FileDumper { /** * {@inheritDoc} */ - public function dump(MessageCatalogue $messages, $options = array()) - { - if (!array_key_exists('path', $options)) { - throw new \InvalidArgumentException('The file dumper need a path options.'); - } - - // save a file for each domain - foreach ($messages->getDomains() as $domain) { - $file = $messages->getLocale().'.'.$this->getExtension(); - $path = $options['path'].'/'.$domain.'/'; - - if (!file_exists($path)) { - mkdir($path); - } - - // backup - if (file_exists($path.$file)) { - copy($path.$file, $path.$file.'~'); - } - - // save file - file_put_contents($path.$file, $this->format($messages, $domain)); - } - } + protected $relativePathTemplate = '{domain}/{locale}.{extension}'; /** * {@inheritDoc} diff --git a/src/Symfony/Component/Translation/Dumper/NullFileDumper.php b/src/Symfony/Component/Translation/Dumper/NullFileDumper.php new file mode 100644 index 0000000000..e628e6ce6a --- /dev/null +++ b/src/Symfony/Component/Translation/Dumper/NullFileDumper.php @@ -0,0 +1,38 @@ + + * + * 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\MessageCatalogue; + +/** + * Null file dumper used for testing purposes. + * + * @author Florian Voutzinos + */ +class NullFileDumper extends FileDumper +{ + /** + * {@inheritDoc} + */ + protected function format(MessageCatalogue $messages, $domain) + { + return ''; + } + + /** + * {@inheritDoc} + */ + protected function getExtension() + { + return 'null'; + } +} diff --git a/src/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php b/src/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php index 7d969ce272..2717c8b2e2 100644 --- a/src/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php +++ b/src/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php @@ -26,7 +26,6 @@ class IcuResFileDumperTest extends \PHPUnit_Framework_TestCase $catalogue->add(array('foo' => 'bar')); $tempDir = sys_get_temp_dir() . '/IcuResFileDumperTest'; - mkdir($tempDir); $dumper = new IcuResFileDumper(); $dumper->dump($catalogue, array('path' => $tempDir)); diff --git a/src/Symfony/Component/Translation/Tests/Dumper/NullFileDumperTest.php b/src/Symfony/Component/Translation/Tests/Dumper/NullFileDumperTest.php new file mode 100644 index 0000000000..9394f54a16 --- /dev/null +++ b/src/Symfony/Component/Translation/Tests/Dumper/NullFileDumperTest.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Tests\Dumper; + +use Symfony\Component\Translation\Dumper\NullFileDumper; +use Symfony\Component\Translation\MessageCatalogue; + +class NullFileDumperTest extends \PHPUnit_Framework_TestCase +{ + public function testDumpBackupsFileIfExisting() + { + $tempDir = sys_get_temp_dir(); + $file = $tempDir.'/messages.en.null'; + $backupFile = $file.'~'; + + @touch($file); + + $catalogue = new MessageCatalogue('en'); + $catalogue->add(array('foo' => 'bar')); + + $dumper = new NullFileDumper(); + $dumper->dump($catalogue, array('path' => $tempDir)); + + $this->assertTrue(file_exists($backupFile)); + + @unlink($file); + @unlink($backupFile); + } + + public function testDumpCreatesNestedDirectoriesAndFile() + { + $tempDir = sys_get_temp_dir(); + $translationsDir = $tempDir.'/test/translations'; + $file = $translationsDir.'/messages.en.null'; + + $catalogue = new MessageCatalogue('en'); + $catalogue->add(array('foo' => 'bar')); + + $dumper = new NullFileDumper(); + $dumper->setRelativePathTemplate('test/translations/{domain}.{locale}.{extension}'); + $dumper->dump($catalogue, array('path' => $tempDir)); + + $this->assertTrue(file_exists($file)); + + @unlink($file); + @rmdir($translationsDir); + } +}