/** * Compares two message catalogues. * * @param MessageCatalogue $current * @param MessageCatalogue $new * @return ChangeSet */ public function compare(MessageCatalogue $current, MessageCatalogue $new) { $newMessages = array(); foreach ($new->getDomains() as $name => $domain) { if ($this->domains && !isset($this->domains[$name])) { continue; } if (isset($this->ignoredDomains[$name])) { continue; } foreach ($domain->all() as $message) { if ($current->has($message)) { // FIXME: Compare what has changed continue; } $newMessages[] = $message; } } $deletedMessages = array(); foreach ($current->getDomains() as $name => $domain) { if ($this->domains && !isset($this->domains[$name])) { continue; } if (isset($this->ignoredDomains[$name])) { continue; } foreach ($domain->all() as $message) { if ($new->has($message)) { continue; } $deletedMessages[] = $message; } } return new ChangeSet($newMessages, $deletedMessages); }
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); }
/** * @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); } } } }
private function getAllTranslations($locale) { $catalogue = new MessageCatalogue(); $loader = $this->get('jms_translation.loader_manager'); // load external resources, so current translations can be reused in the final translation foreach ($this->retrieveDirs() as $resource) { $catalogue->merge($loader->loadFromDirectory($resource, $locale)); } $localesArray = array(); foreach ($catalogue->getDomains() as $domain => $collection) { foreach ($collection->all() as $key => $translation) { $localesArray[$key] = $translation->getLocaleString(); } } return $localesArray; }
/** * @param MessageCatalogue $catalogue */ public function merge(MessageCatalogue $catalogue) { foreach ($catalogue->getDomains() as $name => $domainCatalogue) { $this->getOrCreateDomain($name)->merge($domainCatalogue); } }
public function testMerge() { $cat = new MessageCatalogue(); $cat->add(new Message('foo', 'foo')); $cat2 = new MessageCatalogue(); $cat2->add(new Message('foo', 'bar')); $cat->merge($cat2); $this->assertEquals(array('foo', 'bar'), array_keys($domains = $cat->getDomains())); $this->assertEquals(array('bar'), array_keys($cat2->getDomains())); $this->assertEquals(array('foo'), array_keys($domains['foo']->all())); $this->assertEquals(array('foo'), array_keys($domains['bar']->all())); }