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 int */ protected function execute(InputInterface $input, OutputInterface $output): int { $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 ""'); } return 0; } /** * @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; } } }