setDescription('Extract localizable strings.'); $this->setHelp('This command extracts the localizable string from php files into a .pot file.'); } protected function execute(InputInterface $input, OutputInterface $output): int { try { $folder = $this->getPluginFolder($input); $manifest = $this->getPluginManifest($folder); $localedomain = $this->getPluginLocaleDomainByFolder($folder); // Create locale directories if they don't exist foreach ($this->getSystemLanguages() as $lang) { $lang = explode('_', $lang)[0]; $language_dir = "{$folder}/locale/{$lang}/LC_MESSAGES"; if (!file_exists($language_dir)) { mkdir($language_dir, 0755, true); } } // Extract translations into pot file $main_lang = $this->getSystemLanguages()[0]; $pot_file = "{$folder}/locale/{$main_lang}/LC_MESSAGES/{$localedomain}.pot"; file_put_contents($pot_file, ''); $command_line = implode(' | ', [ 'find "${:FOLDER}" -iname "*.php"', 'xargs xgettext --keyword=_n:1,2 --from-code=UTF-8 -j -n --language=PHP --add-location=never --package-name="${:PACKAGENAME}" -o "${:POTFILE}"', ]); $process = Process::fromShellCommandline($command_line); $process->mustRun(null, [ 'FOLDER' => $folder, 'PACKAGENAME' => $manifest['pluginclassname'], 'POTFILE' => $pot_file, ]); $out = $process->getOutput(); if ($out) { $output->writeln($out, OutputInterface::VERBOSITY_VERBOSE); } // Merge pot into exisiting po files foreach ($this->getSystemLanguages() as $lang) { if ($lang === $main_lang) { continue; } $lang = explode('_', $lang)[0]; $po_file = "{$folder}/locale/{$lang}/LC_MESSAGES/{$localedomain}.po"; if (!file_exists($po_file)) { continue; } $command_line = 'msgmerge --backup=off --update "${:POFILE}" "${:POTFILE}"'; $process = Process::fromShellCommandline($command_line); $process->run(null, [ 'POFILE' => $po_file, 'POTFILE' => $pot_file, ]); if (!$process->isSuccessful()) { $output->writeln( "Update of po file failed: {$out}", OutputInterface::VERBOSITY_VERBOSE ); continue; } $out = $process->getOutput(); if ($out) { $output->writeln($out, OutputInterface::VERBOSITY_VERBOSE); } } $output->writeln("Translation strings have been extracted successfully."); return Command::SUCCESS; } catch (ProcessFailedException $e) { $output->writeln("Could not execute shell command"); $output->writeln($e->getmessage()); return Command::FAILURE; } catch (Exception $e) { $output->writeln("{$e->getMessage()}"); return Command::FAILURE; } } }