protected function doImport($locale)
 {
     $translations = $this->getTranslationsFromSession();
     $existingUnits = $this->repository->getAllByDomainAndKey();
     // Add new translations, create the unit if require
     foreach ($translations[$locale]['new'] as $domain => $newTranslations) {
         foreach ($newTranslations as $key => $value) {
             if (!isset($existingUnits[$domain][$key])) {
                 $existingUnits[$domain][$key] = $this->repository->createUnit($domain, $key, array('created-at-import' => true));
             }
             $existingUnits[$domain][$key]->setTranslation($locale, $value);
         }
     }
     // Update existing translations
     foreach ($translations[$locale]['updated'] as $domain => $newTranslations) {
         foreach ($newTranslations as $key => $data) {
             $existingUnits[$domain][$key]->getTranslation($locale)->setValue($data['new']);
         }
     }
     // Remove the processed locale from the session
     unset($translations[$locale]);
     $this->updateSession($translations);
 }
 public function processImportOfStandardResources($options)
 {
     $options = array_merge(array('locale_list' => null, 'domain_list' => null, 'output' => null, 'import-translations' => false, 'override' => false, 'metadata_locale' => 'en', 'prune' => false), $options);
     if (array_key_exists('output', $options)) {
         $this->logger = $options['output'];
     }
     $locales = $options['locale_list'] !== null ? $options['locale_list'] : $this->getLocaleList();
     // Create all catalogues
     /** @var MessageCatalogue[] $catalogues */
     $catalogues = array();
     foreach ($locales as $locale) {
         $catalogues[$locale] = new MessageCatalogue($locale);
     }
     // Import resources one by one
     $this->log("<info>Evaluation of the file list</info>\n");
     foreach ($this->getStandardResources() as $resource) {
         $this->log("    Resource <fg=cyan>{$resource['path']}</fg=cyan>");
         if ($this->checkIfResourceIsIgnored($resource)) {
             $this->log("  >> <comment>Skipped</comment> (due to ignore settings from the config)\n");
             continue;
         }
         if (!in_array($resource['locale'], $locales)) {
             $this->log("  >> <comment>Skipped</comment> (unwanted locales)\n");
             continue;
         }
         if ($options['domain_list'] !== null && !in_array($resource['domain'], $options['domain_list'])) {
             $this->log("  >> <comment>Skipped</comment> (unwanted domain)\n");
             continue;
         }
         $catalogues[$resource['locale']]->addCatalogue($this->translator->loadResource($resource));
         $this->log("  >> <info>OK</info>\n");
     }
     // Update all units from the catalog
     $this->log("\n<info>Update or create units and associated translations</info>\n");
     $existingUnits = $this->repository->getAllByDomainAndKey();
     $allFileUnits = array();
     foreach ($locales as $locale) {
         foreach ($catalogues[$locale]->all() as $domain => $translations) {
             foreach ($translations as $key => $value) {
                 // Retrieved or create a unit
                 if (!isset($existingUnits[$domain][$key])) {
                     $this->log("\t>> Creation of a new Unit [{$domain}, {$key}]\n");
                     $existingUnits[$domain][$key] = $this->repository->createUnit($domain, $key);
                 }
                 $unit = $existingUnits[$domain][$key];
                 // Update it's metadata
                 if ($locale == $options['metadata_locale']) {
                     $catalogMetadata = $catalogues[$locale]->getMetadata($key, $domain);
                     if ($catalogMetadata !== $unit->getMetadata()) {
                         $unit->setMetadata(is_null($catalogMetadata) ? array() : $catalogMetadata);
                         $this->log("\t>> Metadata of the Unit [{$domain}, {$key}] updated\n");
                     }
                 }
                 // Update translation
                 if ($options['import-translations']) {
                     if ($unit->hasTranslation($locale) && $options['override']) {
                         $this->log("\t>> Translation [{$domain}, {$key}] for [{$locale}] overridden by '{$value}'\n");
                         $unit->setTranslation($locale, $value);
                     }
                     if (!$unit->hasTranslation($locale)) {
                         $this->log("\t>> Translation [{$domain}, {$key}] for [{$locale}] imported\n");
                         $unit->setTranslation($locale, $value);
                     }
                 }
                 // Key a trace of all units from the file for the prune process
                 $allFileUnits[$domain][$key] = true;
             }
         }
     }
     // Potentially remove no more existing units
     if ($options['prune'] === true) {
         $this->log("\n<info>Remove units that are no more present in translation files</info>\n");
         $domains = $options['domain_list'] !== null ? $options['domain_list'] : array_keys($existingUnits);
         foreach ($domains as $domain) {
             if (!isset($allFileUnits[$domain])) {
                 continue;
             }
             $removed = array_diff(array_keys($existingUnits[$domain]), array_keys($allFileUnits[$domain]));
             foreach ($removed as $key) {
                 $this->log("\t>> Translation unit [{$domain}, {$key}] removed\n");
                 $existingUnits[$domain][$key]->delete();
             }
         }
     }
     $this->log("<info>Save the changes</info>\n");
     $this->log("<comment>Persisting</comment> ... ");
     $stat = $this->repository->persist();
     $this->log("<info>Success</info>\n");
     return $stat;
 }