public function write(MessageCatalogue $catalogue, $domain, $filePath, $format)
 {
     $newCatalogue = new MessageCatalogue();
     $newCatalogue->setLocale($catalogue->getLocale());
     foreach (array_keys($catalogue->getDomains()) as $catalogueDomainString) {
         if ($catalogue->getLocale() !== 'en' && $this->hasEnglishCatalogue($filePath)) {
             $englishCatalogue = $this->loadEnglishCatalogue($filePath, $domain, $format);
         }
         $domainMessageCollection = $catalogue->getDomain($catalogueDomainString);
         /** @var Message $message */
         foreach ($domainMessageCollection->all() as $message) {
             if ($message->getDomain() !== $domain) {
                 continue;
             }
             $newMessage = $this->makeXliffMessage($message);
             if ($message->getId() === $message->getSourceString()) {
                 if (isset($englishCatalogue)) {
                     try {
                         $newMessage->setDesc($englishCatalogue->get($message->getId(), $message->getDomain())->getLocaleString());
                     } catch (InvalidArgumentException $e) {
                         continue;
                     }
                 } else {
                     $newMessage->setDesc($message->getLocaleString());
                 }
             }
             $newCatalogue->add($newMessage);
         }
     }
     $this->innerFileWriter->write($newCatalogue, $domain, $filePath, $format);
 }
 public function testGetSetLocale()
 {
     $catalogue = new MessageCatalogue();
     $this->assertNull($catalogue->getLocale());
     $catalogue->setLocale('en');
     $this->assertEquals('en', $catalogue->getLocale());
 }
 /**
  * @param Config $config
  */
 private function setConfig(Config $config)
 {
     $this->config = $config;
     $this->logger->info(sprintf("Loading catalogues from \"%s\"", $config->getTranslationsDir()));
     $this->existingCatalogue = new MessageCatalogue();
     // load external resources, so current translations can be reused in the final translation
     foreach ($config->getLoadResources() as $resource) {
         $this->existingCatalogue->merge($this->loader->loadFromDirectory($resource, $config->getLocale()));
     }
     $this->existingCatalogue->merge($this->loader->loadFromDirectory($config->getTranslationsDir(), $config->getLocale()));
     $this->extractor->reset();
     $this->extractor->setDirectories($config->getScanDirs());
     $this->extractor->setExcludedDirs($config->getExcludedDirs());
     $this->extractor->setExcludedNames($config->getExcludedNames());
     $this->extractor->setEnabledExtractors($config->getEnabledExtractors());
     $this->logger->info("Extracting translation keys");
     $this->scannedCatalogue = $this->extractor->extract();
     $this->scannedCatalogue->setLocale($config->getLocale());
     // merge existing messages into scanned messages
     foreach ($this->scannedCatalogue->getDomains() as $domainCatalogue) {
         foreach ($domainCatalogue->all() as $message) {
             if (!$this->existingCatalogue->has($message)) {
                 continue;
             }
             $existingMessage = clone $this->existingCatalogue->get($message->getId(), $message->getDomain());
             $existingMessage->mergeScanned($message);
             $this->scannedCatalogue->set($existingMessage, true);
         }
     }
     if ($this->config->isKeepOldMessages()) {
         foreach ($this->existingCatalogue->getDomains() as $domainCatalogue) {
             foreach ($domainCatalogue->all() as $message) {
                 if ($this->scannedCatalogue->has($message)) {
                     continue;
                 }
                 $this->scannedCatalogue->add($message);
             }
         }
     }
     //keep old translations translated
     if ($this->config->isKeepOldTranslationMessages()) {
         $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);
             }
         }
     }
 }
 public function dump(MessageCatalogue $catalogue, $domain = 'messages', $filePath = null)
 {
     $symfonyCatalogue = new SymfonyCatalogue($catalogue->getLocale());
     foreach ($catalogue->getDomain($domain)->all() as $id => $message) {
         $symfonyCatalogue->add(array($id => $message->getLocaleString()), $domain);
     }
     $tmpPath = sys_get_temp_dir() . '/' . uniqid('translation', false);
     if (!is_dir($tmpPath) && false === @mkdir($tmpPath, 0777, true)) {
         throw new RuntimeException(sprintf('Could not create temporary directory "%s".', $tmpPath));
     }
     $this->dumper->dump($symfonyCatalogue, array('path' => $tmpPath));
     if (!is_file($tmpFile = $tmpPath . '/' . $domain . '.' . $catalogue->getLocale() . '.' . $this->format)) {
         throw new RuntimeException(sprintf('Could not find dumped translation file "%s".', $tmpFile));
     }
     $contents = file_get_contents($tmpFile);
     $fs = new Filesystem();
     $fs->remove($tmpPath);
     if ('' === $contents) {
         throw new RuntimeException(sprintf('Could not dump message catalogue using dumper "%s". It could be that it is not compatible.', get_class($this->dumper)));
     }
     return $contents;
 }
 /**
  * @param \JMS\TranslationBundle\Model\MessageCatalogue $domain
  * @return string
  */
 public function dump(MessageCatalogue $catalogue, $domain = 'messages')
 {
     $doc = new \DOMDocument('1.0', 'utf-8');
     $doc->formatOutput = true;
     $doc->appendChild($root = $doc->createElement('xliff'));
     $root->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
     $root->setAttribute('xmlns:jms', 'urn:jms:translation');
     $root->setAttribute('version', '1.2');
     $root->appendChild($file = $doc->createElement('file'));
     if ($this->addDate) {
         $date = new \DateTime();
         $file->setAttribute('date', $date->format('Y-m-d\\TH:i:s\\Z'));
     }
     $file->setAttribute('source-language', $this->sourceLanguage);
     $file->setAttribute('target-language', $catalogue->getLocale());
     $file->setAttribute('datatype', 'plaintext');
     $file->setAttribute('original', 'not.available');
     $file->appendChild($header = $doc->createElement('header'));
     $header->appendChild($tool = $doc->createElement('tool'));
     $tool->setAttribute('tool-id', 'JMSTranslationBundle');
     $tool->setAttribute('tool-name', 'JMSTranslationBundle');
     $tool->setAttribute('tool-version', JMSTranslationBundle::VERSION);
     $header->appendChild($note = $doc->createElement('note'));
     $note->appendChild($doc->createTextNode('The source node in most cases contains the sample message as written by the developer. If it looks like a dot-delimitted string such as "form.label.firstname", then the developer has not provided a default message.'));
     $file->appendChild($body = $doc->createElement('body'));
     foreach ($catalogue->getDomain($domain)->all() as $id => $message) {
         $body->appendChild($unit = $doc->createElement('trans-unit'));
         $unit->setAttribute('id', hash('sha1', $id));
         $unit->setAttribute('resname', $id);
         $unit->appendChild($source = $doc->createElement('source'));
         if (preg_match('/[<>&]/', $message->getSourceString())) {
             $source->appendChild($doc->createCDATASection($message->getSourceString()));
         } else {
             $source->appendChild($doc->createTextNode($message->getSourceString()));
         }
         $unit->appendChild($target = $doc->createElement('target'));
         if (preg_match('/[<>&]/', $message->getLocaleString())) {
             $target->appendChild($doc->createCDATASection($message->getLocaleString()));
         } else {
             $target->appendChild($doc->createTextNode($message->getLocaleString()));
         }
         if ($message->isNew()) {
             $target->setAttribute('state', 'new');
         }
         // As per the OASIS XLIFF 1.2 non-XLIFF elements must be at the end of the <trans-unit>
         if ($sources = $message->getSources()) {
             foreach ($sources as $source) {
                 if ($source instanceof FileSource) {
                     $unit->appendChild($refFile = $doc->createElement('jms:reference-file', $source->getPath()));
                     if ($source->getLine()) {
                         $refFile->setAttribute('line', $source->getLine());
                     }
                     if ($source->getColumn()) {
                         $refFile->setAttribute('column', $source->getColumn());
                     }
                     continue;
                 }
                 $unit->appendChild($doc->createElementNS('jms:reference', (string) $source));
             }
         }
         if ($meaning = $message->getMeaning()) {
             $unit->setAttribute('extradata', 'Meaning: ' . $meaning);
         }
     }
     return $doc->saveXML();
 }
 public function dump(MessageCatalogue $catalogue, $domain = 'messages')
 {
     $this->catalogue = $catalogue;
     $this->locale = $catalogue->getLocale();
     return parent::dump($catalogue, $domain);
 }