Skip to content

[Translation] Added template for relative file paths in FileDumper #9852

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 3, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/Symfony/Component/Translation/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
-----

Expand Down
42 changes: 40 additions & 2 deletions src/Symfony/Component/Translation/Dumper/FileDumper.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,23 @@
*/
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;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it need to be public or do we only need it internally?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually this method is only used in a test and could be removed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it can be useful to be able to inspect the template that is currently set.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tend to agree with @jakzal. Exposing this information from the Dumper does not seem like a good idea. Again, most of the time, the default just work fine, so if you override it, it means that this information is already managed somewhere else.


/**
* {@inheritDoc}
*/
Expand All @@ -35,11 +52,15 @@ public function dump(MessageCatalogue $messages, $options = array())

// 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));
Expand All @@ -62,4 +83,21 @@ abstract protected function format(MessageCatalogue $messages, $domain);
* @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()
));
}
}
27 changes: 2 additions & 25 deletions src/Symfony/Component/Translation/Dumper/IcuResFileDumper.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,35 +18,12 @@
*
* @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}
Expand Down
70 changes: 70 additions & 0 deletions src/Symfony/Component/Translation/Tests/Dumper/FileDumperTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?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\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\FileDumper;

class FileDumperTest extends \PHPUnit_Framework_TestCase
{
public function testDumpBackupsFileIfExisting()
{
$tempDir = sys_get_temp_dir();
$file = $tempDir.'/messages.en.concrete';
$backupFile = $file.'~';

@touch($file);

$catalogue = new MessageCatalogue('en');
$catalogue->add(array('foo' => 'bar'));

$dumper = new ConcreteFileDumper();
$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.concrete';

$catalogue = new MessageCatalogue('en');
$catalogue->add(array('foo' => 'bar'));

$dumper = new ConcreteFileDumper();
$dumper->setRelativePathTemplate('test/translations/%domain%.%locale%.%extension%');
$dumper->dump($catalogue, array('path' => $tempDir));

$this->assertTrue(file_exists($file));

@unlink($file);
@rmdir($translationsDir);
}
}

class ConcreteFileDumper extends FileDumper
{
protected function format(MessageCatalogue $messages, $domain)
{
return '';
}

protected function getExtension()
{
return 'concrete';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,13 @@ public function testDump()
$catalogue->add(array('foo' => 'bar'));

$tempDir = sys_get_temp_dir() . '/IcuResFileDumperTest';
mkdir($tempDir);
$dumper = new IcuResFileDumper();
$dumper->dump($catalogue, array('path' => $tempDir));

$this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resourcebundle/res/en.res'), file_get_contents($tempDir.'/messages/en.res'));

unlink($tempDir.'/messages/en.res');
rmdir($tempDir.'/messages');
rmdir($tempDir);
@unlink($tempDir.'/messages/en.res');
@rmdir($tempDir.'/messages');
@rmdir($tempDir);
}
}