/** * Get a profile's translation messages based on a previous Profiler token. * * @param string $token by which a Profile can be found in the Profiler * * @return array with collection of TransUnits and it's count */ public function getByToken($token) { if (null === $this->profiler) { throw new \RuntimeException('Invalid profiler instance.'); } $profile = $this->profiler->loadProfile($token); // In case no results were found if (!$profile instanceof Profile) { return array(array(), 0); } try { /** @var TranslationDataCollector $collector */ $collector = $profile->getCollector('translation'); $messages = $collector->getMessages(); $transUnits = array(); foreach ($messages as $message) { $transUnit = $this->storage->getTransUnitByKeyAndDomain($message['id'], $message['domain']); if ($transUnit instanceof TransUnit) { $transUnits[] = $transUnit; } elseif (true === $this->createMissing) { $transUnits[] = $transUnit = $this->transUnitManager->create($message['id'], $message['domain'], true); } // Also store the translation if profiler state was defined if (!$transUnit->hasTranslation($message['locale']) && $message['state'] == DataCollectorTranslator::MESSAGE_DEFINED) { $this->transUnitManager->addTranslation($transUnit, $message['locale'], $message['translation'], null, true); } } return array($transUnits, count($transUnits)); } catch (\InvalidArgumentException $e) { // Translation collector is a 2.7 feature return array(array(), 0); } }
/** * Impoort the given file and return the number of inserted translations. * * @param \Symfony\Component\Finder\SplFileInfo $file * @param boolean $forceUpdate force update of the translations * @return int */ public function import(\Symfony\Component\Finder\SplFileInfo $file, $forceUpdate = false) { $imported = 0; list($domain, $locale, $extention) = explode('.', $file->getFilename()); if (isset($this->loaders[$extention])) { $messageCatalogue = $this->loaders[$extention]->load($file->getPathname(), $locale, $domain); $translationFile = $this->fileManager->getFor($file->getFilename(), $file->getPath()); foreach ($messageCatalogue->all($domain) as $key => $content) { // skip empty translation values if (!isset($content)) { continue; } $transUnit = $this->storage->getTransUnitByKeyAndDomain($key, $domain); if (!$transUnit instanceof TransUnitInterface) { $transUnit = $this->transUnitManager->create($key, $domain); } $translation = $this->transUnitManager->addTranslation($transUnit, $locale, $content, $translationFile); if ($translation instanceof TranslationInterface) { $imported++; } else { if ($forceUpdate) { $translation = $this->transUnitManager->updateTranslation($transUnit, $locale, $content); $imported++; } } // convert MongoTimestamp objects to time to don't get an error in: // Doctrine\ODM\MongoDB\Mapping\Types\TimestampType::convertToDatabaseValue() if ($transUnit instanceof TransUnitDocument) { $transUnit->convertMongoTimestamp(); } } $this->storage->flush(); // clear only Lexik entities foreach (array('file', 'trans_unit', 'translation') as $name) { $this->storage->clear($this->storage->getModelClass($name)); } } else { throw new \RuntimeException(sprintf('No load found for "%s" format.', $extention)); } return $imported; }