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); + } + } + } } }