diff --git a/cli/Commands/Plugins/I18N/I18NExtract.php b/cli/Commands/Plugins/I18N/I18NExtract.php index e1f479fbe8e4a9ba95b207a91a1f4214852a579c..cc037db500871a2346225d45e0a52df3bb871920 100644 --- a/cli/Commands/Plugins/I18N/I18NExtract.php +++ b/cli/Commands/Plugins/I18N/I18NExtract.php @@ -23,10 +23,11 @@ final class I18NExtract extends I18NCommand protected function execute(InputInterface $input, OutputInterface $output): int { try { - $folder = $this->getPluginFolder($input); + $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"; @@ -35,6 +36,7 @@ final class I18NExtract extends I18NCommand } } + // 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, ''); @@ -46,26 +48,57 @@ final class I18NExtract extends I18NCommand $process = Process::fromShellCommandline($command_line); - try { - $process->mustRun(null, [ - 'FOLDER' => $folder, - 'PACKAGENAME' => $manifest['pluginclassname'], - 'POTFILE' => $pot_file, + $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( + "<error>Update of po file failed: {$out}</error>", + 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("<error>Could not execute shell command</error>"); - $output->writeln($e->getmessage()); - return Command::FAILURE; } + $output->writeln("Translation strings have been extracted successfully."); + return Command::SUCCESS; + } catch (ProcessFailedException $e) { + $output->writeln("<error>Could not execute shell command</error>"); + $output->writeln($e->getmessage()); + return Command::FAILURE; } catch (Exception $e) { $output->writeln("<error>{$e->getMessage()}</error>"); return Command::FAILURE;