| <?php |
|
|
| namespace Kanboard\Console; |
|
|
| use RecursiveIteratorIterator; |
| use RecursiveDirectoryIterator; |
| use Symfony\Component\Console\Input\InputInterface; |
| use Symfony\Component\Console\Output\OutputInterface; |
|
|
| class LocaleComparatorCommand extends BaseCommand |
| { |
| const REF_LOCALE = 'fr_FR'; |
|
|
| protected function configure() |
| { |
| $this |
| ->setName('locale:compare') |
| ->setDescription('Compare application translations with the '.self::REF_LOCALE.' locale'); |
| } |
|
|
| protected function execute(InputInterface $input, OutputInterface $output): int |
| { |
| $strings = array(); |
| $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(APP_DIR)); |
| $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)); |
| return 0; |
| } |
|
|
| public function show(array $strings) |
| { |
| foreach ($strings as $string) { |
| echo " '".str_replace("'", "\'", $string)."' => '',".PHP_EOL; |
| } |
| } |
|
|
| public function compare(array $strings) |
| { |
| $reference_file = APP_DIR.DIRECTORY_SEPARATOR.'Locale'.DIRECTORY_SEPARATOR.self::REF_LOCALE.DIRECTORY_SEPARATOR.'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]\s*\(\s*(\'\K.*?\')\s*[\)\,]/', $content, $matches) && isset($matches[1])) { |
| $strings = $matches[1]; |
| } |
|
|
| if (preg_match_all('/\bdt\s*\(\s*(\'\K.*?\')\s*[\)\,]/', $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; |
| } |
| } |
|
|