function updateTranslations($source_dir, $dry_run = false)
 {
     $loader = new lmbFsDictionaryExtractor();
     $loader->registerFileParser('.html', new lmbWACTDictionaryExtractor());
     $loader->registerFileParser('.php', new lmbPHPDictionaryExtractor());
     $loader->registerFileParser('.phtml', new lmbPHPDictionaryExtractor());
     $dicts = array();
     $iterator = new lmbFsRecursiveIterator($source_dir);
     $this->response->write("======== Extracting translations from source ========\n");
     $loader->traverse($iterator, $dicts, $this->response);
     if (!($translations = $this->backend->loadAll())) {
         $this->response->write("======== No existing translations found!(create them first) ========\n");
         return;
     }
     $this->response->write("======== Updating translations ========\n");
     foreach ($translations as $locale => $domains) {
         foreach ($domains as $domain => $old_dict) {
             if (isset($dicts[$domain])) {
                 $this->response->write($this->backend->info($locale, $domain) . "...");
                 $new_dict = $dicts[$domain]->merge($old_dict);
                 if (!$dry_run) {
                     $this->backend->save($locale, $domain, $new_dict);
                     $this->response->write("updated\n");
                 } else {
                     $this->response->write("skipped(dry-run)\n");
                 }
             }
         }
     }
 }
 function testLoad()
 {
     $it = new MockFsRecursiveIterator();
     $m1 = new MockBaseDictionaryParser();
     $m2 = new MockBaseDictionaryParser();
     $it->setReturnValueAt(0, 'valid', true);
     $it->setReturnValueAt(0, 'isFile', false);
     $it->setReturnValueAt(0, 'current', 'junky');
     $file_path1 = 'some.php';
     $file_path2 = 'some.html';
     $it->setReturnValueAt(1, 'valid', true);
     $it->setReturnValueAt(1, 'current', $file_path1);
     $it->setReturnValueAt(1, 'isFile', true);
     $it->setReturnValueAt(2, 'valid', true);
     $it->setReturnValueAt(2, 'current', $file_path2);
     $it->setReturnValueAt(2, 'isFile', true);
     $loader = new lmbFsDictionaryExtractor();
     $loader->registerFileParser('.php', $m1);
     $loader->registerFileParser('.html', $m2);
     $dictionaries = array();
     $response = new lmbCliOutput();
     $m1->expectOnce('extractFromFile', array($file_path1, $dictionaries, $response));
     $m2->expectOnce('extractFromFile', array($file_path2, $dictionaries, $response));
     $loader->traverse($it, $dictionaries, $response);
 }