setName('locale:compare') ->setDescription('Compare application translations with the '.self::REF_LOCALE.' locale'); } protected function execute(InputInterface $input, OutputInterface $output) { $strings = array(); $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('app')); $it->rewind(); while ($it->valid()) { if (! $it->isDot() && substr($it->key(), -4) === '.php') { $strings = array_merge($strings, $this->search($it->key())); } $it->next(); } $this->compare(array_unique($strings)); } public function show(array $strings) { foreach ($strings as $string) { echo " '".str_replace("'", "\'", $string)."' => '',".PHP_EOL; } } public function compare(array $strings) { $reference_file = 'app/Locale/'.self::REF_LOCALE.'/translations.php'; $reference = include $reference_file; echo str_repeat('#', 70).PHP_EOL; echo 'MISSING STRINGS'.PHP_EOL; echo str_repeat('#', 70).PHP_EOL; $this->show(array_diff($strings, array_keys($reference))); echo str_repeat('#', 70).PHP_EOL; echo 'USELESS STRINGS'.PHP_EOL; echo str_repeat('#', 70).PHP_EOL; $this->show(array_diff(array_keys($reference), $strings)); } public function search($filename) { $content = file_get_contents($filename); $strings = array(); if (preg_match_all('/\b[et]\((\'\K.*?\') *[\)\,]/', $content, $matches) && isset($matches[1])) { $strings = $matches[1]; } if (preg_match_all('/\bdt\((\'\K.*?\') *[\)\,]/', $content, $matches) && isset($matches[1])) { $strings = array_merge($strings, $matches[1]); } array_walk($strings, function (&$value) { $value = trim($value, "'"); $value = str_replace("\'", "'", $value); }); return $strings; } }