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