diff --git a/composer.json b/composer.json index 9c5c4f9565..852d0ab1a8 100644 --- a/composer.json +++ b/composer.json @@ -90,6 +90,7 @@ "pragmarx/google2fa-qrcode": "^1.0.1", "samyoul/u2f-php-server": "^1.1", "squizlabs/php_codesniffer": "^3.0", + "symfony/console": "^4.3", "tecnickcom/tcpdf": "^6.3" }, "extra": { diff --git a/libraries/classes/Command/AdvisoryRulesCommand.php b/libraries/classes/Command/AdvisoryRulesCommand.php new file mode 100644 index 0000000000..d68cce12c2 --- /dev/null +++ b/libraries/classes/Command/AdvisoryRulesCommand.php @@ -0,0 +1,112 @@ +setDescription('Translates advisory rules to Gettext format'); + $this->setHelp( + 'This command parses advisory rules and output them' + . ' as Gettext POT formatted strings for translation.' + ); + } + + /** + * @param InputInterface $input input + * @param OutputInterface $output output + * + * @return void + */ + protected function execute(InputInterface $input, OutputInterface $output): void + { + $ruleFiles = []; + $ruleFiles[Advisor::GENERIC_RULES_FILE] = Advisor::parseRulesFile( + Advisor::GENERIC_RULES_FILE + ); + $ruleFiles[Advisor::BEFORE_MYSQL80003_RULES_FILE] = Advisor::parseRulesFile( + Advisor::BEFORE_MYSQL80003_RULES_FILE + ); + + foreach ($ruleFiles as $file => $rules) { + foreach ($rules['rules'] as $idx => $rule) { + $this->addMessage($file, $rules, $idx, 'name'); + $this->addMessage($file, $rules, $idx, 'issue'); + $this->addMessage($file, $rules, $idx, 'recommendation'); + $this->addMessage($file, $rules, $idx, 'justification'); + } + } + + foreach ($this->messages as $index => $message) { + $output->writeln(''); + $output->write('#: '); + $output->writeln(implode(' ', $this->locations[$index])); + if (strstr($this->messages[$index], '%') !== false) { + $output->writeln('#, php-format'); + } + $output->write('msgid "'); + $output->write(addcslashes( + Advisor::escapePercent($this->messages[$index]), + '"\\' + )); + $output->writeln('"'); + $output->writeln('msgstr ""'); + } + } + + /** + * @param string $file file name + * @param array $rules rules array + * @param int $index rule index + * @param string $type rule type + * + * @return void + */ + private function addMessage(string $file, array $rules, int $index, string $type): void + { + if ($type == 'justification') { + $messages = Advisor::splitJustification($rules['rules'][$index]); + $message = $messages[0]; + } else { + $message = $rules['rules'][$index][$type]; + } + $line = $file . ':' . $rules['lines'][$index][$type]; + + $pos = array_search($message, $this->messages); + if ($pos === false) { + $this->messages[] = $message; + $this->locations[] = [$line]; + } else { + $this->locations[$pos][] = $line; + } + } +} diff --git a/scripts/advisor2po b/scripts/advisor2po deleted file mode 100644 index f6fd29eea3..0000000000 --- a/scripts/advisor2po +++ /dev/null @@ -1,77 +0,0 @@ - $rules) { - foreach ($rules['rules'] as $idx => $rule) { - add_message($file, $rules, $idx, 'name'); - add_message($file, $rules, $idx, 'issue'); - add_message($file, $rules, $idx, 'recommendation'); - add_message($file, $rules, $idx, 'justification'); - } -} - -foreach($messages as $idx => $rule) { - print_message($idx); -} diff --git a/scripts/console b/scripts/console new file mode 100755 index 0000000000..cfbfc01bef --- /dev/null +++ b/scripts/console @@ -0,0 +1,19 @@ +#!/usr/bin/env php +add(new AdvisoryRulesCommand()); + +$application->run(); diff --git a/scripts/update-po b/scripts/update-po index fdeebaa129..6c5390b923 100755 --- a/scripts/update-po +++ b/scripts/update-po @@ -37,7 +37,7 @@ php scripts/fix-po-twig rm -rf twig-templates/ # Generate PHP code for advisor rules -php ./scripts/advisor2po >> po/phpmyadmin.pot +php scripts/console po:advisory-rules >> po/phpmyadmin.pot ver=`sed -n "/PMA_VERSION', '/ s/.*PMA_VERSION', '\(.*\)'.*/\1/p" libraries/classes/Config.php`