diff --git a/Command/ExtractTranslationCommand.php b/Command/ExtractTranslationCommand.php
index d099e79a..f5fc547b 100644
--- a/Command/ExtractTranslationCommand.php
+++ b/Command/ExtractTranslationCommand.php
@@ -55,15 +55,15 @@ protected function configure()
->addOption('output-format', null, InputOption::VALUE_REQUIRED, 'The output format that should be used (in most cases, it is better to change only the default-output-format).')
->addOption('default-output-format', null, InputOption::VALUE_REQUIRED, 'The default output format (defaults to xliff).')
->addOption('keep', null, InputOption::VALUE_NONE, 'Define if the updater service should keep the old translation (defaults to false).')
- ->addOption('external-translations-dir', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED , 'Load external translation ressources')
- ;
+ ->addOption('keeptm', null, InputOption::VALUE_NONE, 'Define if the updater service should keep the old translation messages (defaults to false).')
+ ->addOption('external-translations-dir', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Load external translation ressources');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$builder = $input->getOption('config') ?
- $this->getContainer()->get('jms_translation.config_factory')->getBuilder($input->getOption('config'))
- : new ConfigBuilder();
+ $this->getContainer()->get('jms_translation.config_factory')->getBuilder($input->getOption('config'))
+ : new ConfigBuilder();
$this->updateWithInput($input, $builder);
@@ -81,11 +81,12 @@ protected function execute(InputInterface $input, OutputInterface $output)
$output->writeln(sprintf('Extracting Translations for locale %s', $locale));
$output->writeln(sprintf('Keep old translations: %s', $config->isKeepOldMessages() ? 'Yes' : 'No'));
+ $output->writeln(sprintf('Keep old translations messages: %s', $config->isKeepOldTranslationsMessages() ? 'Yes' : 'No'));
$output->writeln(sprintf('Output-Path: %s', $config->getTranslationsDir()));
$output->writeln(sprintf('Directories: %s', implode(', ', $config->getScanDirs())));
$output->writeln(sprintf('Excluded Directories: %s', $config->getExcludedDirs() ? implode(', ', $config->getExcludedDirs()) : '# none #'));
$output->writeln(sprintf('Excluded Names: %s', $config->getExcludedNames() ? implode(', ', $config->getExcludedNames()) : '# none #'));
- $output->writeln(sprintf('Output-Format: %s', $config->getOutputFormat() ? $config->getOutputFormat() : '# whatever is present, if nothing then '.$config->getDefaultOutputFormat().' #'));
+ $output->writeln(sprintf('Output-Format: %s', $config->getOutputFormat() ? $config->getOutputFormat() : '# whatever is present, if nothing then ' . $config->getDefaultOutputFormat() . ' #'));
$output->writeln(sprintf('Custom Extractors: %s', $config->getEnabledExtractors() ? implode(', ', array_keys($config->getEnabledExtractors())) : '# none #'));
$output->writeln('============================================================');
@@ -99,24 +100,36 @@ protected function execute(InputInterface $input, OutputInterface $output)
if ($input->getOption('dry-run')) {
$changeSet = $updater->getChangeSet($config);
- $output->writeln('Added Messages: '.count($changeSet->getAddedMessages()));
- if($input->hasParameterOption('--verbose')){
- foreach($changeSet->getAddedMessages() as $message){
- $output->writeln($message->getId(). '-> '.$message->getDesc());
- }
+ $output->writeln('Added Messages: ' . count($changeSet->getAddedMessages()));
+ if ($input->hasParameterOption('--verbose')) {
+ foreach ($changeSet->getAddedMessages() as $message) {
+ $output->writeln($message->getId() . '-> ' . $message->getDesc());
+ }
}
if ($config->isKeepOldMessages()) {
$output->writeln('Deleted Messages: # none as "Keep Old Translations" is true #');
} else {
- $output->writeln('Deleted Messages: '.count($changeSet->getDeletedMessages()));
- if($input->hasParameterOption('--verbose')){
- foreach($changeSet->getDeletedMessages() as $message){
- $output->writeln($message->getId(). '-> '.$message->getDesc());
- }
+ $output->writeln('Deleted Messages: ' . count($changeSet->getDeletedMessages()));
+ if ($input->hasParameterOption('--verbose')) {
+ foreach ($changeSet->getDeletedMessages() as $message) {
+ $output->writeln($message->getId() . '-> ' . $message->getDesc());
+ }
}
}
+ if ($config->isKeepOldTranslationsMessages()) {
+ $output->writeln('Not keeping old Translations Messages');
+ } else {
+ //todog
+ /* $output->writeln('Deleted Messages: ' . count($changeSet->getDeletedMessages()));
+ if ($input->hasParameterOption('--verbose')) {
+ foreach ($changeSet->getDeletedMessages() as $message) {
+ $output->writeln($message->getId() . '-> ' . $message->getDesc());
+ }
+ }*/
+ }
+
return;
}
@@ -134,7 +147,7 @@ private function updateWithInput(InputInterface $input, ConfigBuilder $builder)
}
$bundle = $this->getApplication()->getKernel()->getBundle($bundle);
- $builder->setTranslationsDir($bundle->getPath().'/Resources/translations');
+ $builder->setTranslationsDir($bundle->getPath() . '/Resources/translations');
$builder->setScanDirs(array($bundle->getPath()));
}
@@ -192,6 +205,13 @@ private function updateWithInput(InputInterface $input, ConfigBuilder $builder)
$builder->setKeepOldTranslations(false);
}
+
+ if ($input->hasParameterOption('--keeptm') || $input->hasParameterOption('--keeptm=true')) {
+ $builder->setKeepOldTranslationsMessages(true);
+ } else if ($input->hasParameterOption('--keeptm=false')) {
+ $builder->setKeepOldTranslationsMessages(false);
+ }
+
if ($loadResource = $input->getOption('external-translations-dir')) {
$builder->setLoadResources($loadResource);
}
diff --git a/Resources/config/services.xml b/Resources/config/services.xml
index da663552..355db336 100644
--- a/Resources/config/services.xml
+++ b/Resources/config/services.xml
@@ -38,6 +38,7 @@
+
diff --git a/Tests/Functional/ExtractCommandTest.php b/Tests/Functional/ExtractCommandTest.php
index 04c5f1a1..7caf6fab 100644
--- a/Tests/Functional/ExtractCommandTest.php
+++ b/Tests/Functional/ExtractCommandTest.php
@@ -38,6 +38,7 @@ public function testExtract()
$expectedOutput =
'Extracting Translations for locale en'."\n"
.'Keep old translations: No'."\n"
+ .'Keep old translations messages: No'."\n"
.'Output-Path: '.$outputDir."\n"
.'Directories: '.$inputDir."\n"
.'Excluded Directories: Tests'."\n"
diff --git a/Translation/Config.php b/Translation/Config.php
index 61438503..b4b27fe0 100644
--- a/Translation/Config.php
+++ b/Translation/Config.php
@@ -42,10 +42,11 @@ final class Config
private $enabledExtractors;
private $keepOldMessages;
+ private $keepOldTranslationsMessages;
private $loadResources;
- public function __construct($translationsDir, $locale, array $ignoredDomains, array $domains, $outputFormat, $defaultOutputFormat, array $scanDirs, array $excludedDirs, array $excludedNames, array $enabledExtractors, $keepOldMessages, array $loadResources)
+ public function __construct($translationsDir, $locale, array $ignoredDomains, array $domains, $outputFormat, $defaultOutputFormat, array $scanDirs, array $excludedDirs, array $excludedNames, array $enabledExtractors, $keepOldMessages, $keepOldTranslationsMessages, array $loadResources)
{
if (empty($translationsDir)) {
throw new InvalidArgumentException('The directory where translations are must be set.');
@@ -84,6 +85,7 @@ public function __construct($translationsDir, $locale, array $ignoredDomains, ar
$this->excludedNames = $excludedNames;
$this->enabledExtractors = $enabledExtractors;
$this->keepOldMessages = $keepOldMessages;
+ $this->keepOldTranslationsMessages = $keepOldTranslationsMessages;
$this->loadResources = $loadResources;
}
@@ -201,6 +203,15 @@ public function isKeepOldMessages()
return $this->keepOldMessages;
}
+ /**
+ * @return Boolean
+ */
+ public function isKeepOldTranslationsMessages()
+ {
+ return $this->keepOldTranslationsMessages;
+ }
+
+
/**
* @return array
*/
diff --git a/Translation/ConfigBuilder.php b/Translation/ConfigBuilder.php
index 9d7b79df..c50783d9 100644
--- a/Translation/ConfigBuilder.php
+++ b/Translation/ConfigBuilder.php
@@ -31,6 +31,7 @@ final class ConfigBuilder
private $excludedNames = array('*Test.php', '*TestCase.php');
private $enabledExtractors = array();
private $keepOldTranslations = false;
+ private $keepOldTranslationsMessages = false;
private $loadResources = array();
/**
@@ -188,6 +189,14 @@ public function setKeepOldTranslations($value)
return $this;
}
+
+ public function setKeepOldTranslationsMessages($value)
+ {
+ $this->keepOldTranslationsMessages = $value;
+
+ return $this;
+ }
+
public function getConfig()
{
return new Config(
@@ -202,6 +211,7 @@ public function getConfig()
$this->excludedNames,
$this->enabledExtractors,
$this->keepOldTranslations,
+ $this->keepOldTranslationsMessages,
$this->loadResources
);
}
diff --git a/Translation/Updater.php b/Translation/Updater.php
index fd57c691..dda1404a 100644
--- a/Translation/Updater.php
+++ b/Translation/Updater.php
@@ -24,7 +24,9 @@
use JMS\TranslationBundle\Model\Message;
use JMS\TranslationBundle\Translation\Comparison\CatalogueComparator;
+use Symfony\Bundle\FrameworkBundle\Translation\Translator;
use Symfony\Component\HttpKernel\Log\LoggerInterface;
+use Symfony\Component\Translation\DataCollectorTranslator;
use Symfony\Component\Translation\MessageCatalogue as SymfonyMessageCatalogue;
use Symfony\Component\Finder\Finder;
use Symfony\Bundle\FrameworkBundle\Translation\TranslationLoader;
@@ -52,6 +54,7 @@ class Updater
private $scannedCatalogue;
private $logger;
private $writer;
+ private $translator;
/**
* @param LoaderManager $loader
@@ -59,12 +62,13 @@ class Updater
* @param \Symfony\Component\HttpKernel\Log\LoggerInterface $logger
* @param FileWriter $writer
*/
- public function __construct(LoaderManager $loader, ExtractorManager $extractor, LoggerInterface $logger, FileWriter $writer)
+ public function __construct(LoaderManager $loader, ExtractorManager $extractor, LoggerInterface $logger, FileWriter $writer, Translator $translator)
{
$this->loader = $loader;
$this->extractor = $extractor;
$this->logger = $logger;
$this->writer = $writer;
+ $this->translator = $translator;
}
/**
@@ -105,8 +109,7 @@ public function updateTranslation($file, $format, $domain, $locale, $id, $trans)
$catalogue
->get($id, $domain)
->setLocaleString($trans)
- ->setNew(false)
- ;
+ ->setNew(false);
$this->writer->write($catalogue, $domain, $file, $format);
}
@@ -136,8 +139,8 @@ public function process(Config $config)
$format = $this->detectOutputFormat($name);
// delete translation files of other formats
- foreach (Finder::create()->name('/^'.$name.'\.'.$this->config->getLocale().'\.[^\.]+$/')->in($this->config->getTranslationsDir())->depth('< 1')->files() as $file) {
- if ('.'.$format === substr($file, -1 * strlen('.'.$format))) {
+ foreach (Finder::create()->name('/^' . $name . '\.' . $this->config->getLocale() . '\.[^\.]+$/')->in($this->config->getTranslationsDir())->depth('< 1')->files() as $file) {
+ if ('.' . $format === substr($file, -1 * strlen('.' . $format))) {
continue;
}
@@ -148,7 +151,7 @@ public function process(Config $config)
}
}
- $outputFile = $this->config->getTranslationsDir().'/'.$name.'.'.$this->config->getLocale().'.'.$format;
+ $outputFile = $this->config->getTranslationsDir() . '/' . $name . '.' . $this->config->getLocale() . '.' . $format;
$this->logger->info(sprintf('Writing translation file "%s".', $outputFile));
$this->writer->write($this->scannedCatalogue, $name, $outputFile, $format);
}
@@ -171,7 +174,7 @@ private function detectOutputFormat($currentDomain)
$otherDomainFormat = $localeFormat = $otherLocaleFormat = null;
foreach (FileUtils::findTranslationFiles($this->config->getTranslationsDir()) as $domain => $locales) {
foreach ($locales as $locale => $fileData) {
- list($format, ) = $fileData;
+ list($format,) = $fileData;
if ($currentDomain !== $domain) {
$otherDomainFormat = $format;
@@ -245,6 +248,7 @@ private function setConfig(Config $config)
}
}
+ //keep old translations
if ($this->config->isKeepOldMessages()) {
foreach ($this->existingCatalogue->getDomains() as $domainCatalogue) {
foreach ($domainCatalogue->all() as $message) {
@@ -256,5 +260,22 @@ private function setConfig(Config $config)
}
}
}
+
+ //keep old translations translated
+ if ($this->config->isKeepOldTranslationsMessages()) {
+
+ $locale = $this->scannedCatalogue->getLocale();
+ /** @var MessageCatalogue $domainCatalogue */
+ foreach ($this->scannedCatalogue->getDomains() as $domainCatalogue) {
+
+ /** @var Message $message */
+ foreach ($domainCatalogue->all() as $message) {
+
+ $translated = $this->translator->trans($message->getId(), array(), $message->getDomain(), $locale);
+ $message->setLocaleString($translated);
+ $message->setNew(false);
+ }
+ }
+ }
}
}