From dcc986fad8ec597695d78e309890e6fd7dc6ccb3 Mon Sep 17 00:00:00 2001 From: Nikolay Lobachev Date: Fri, 26 Jan 2018 17:36:13 +0100 Subject: [PATCH] [locale:language:add] Add multiple languages as arguments (#3738) * Add opportunity to add multiple languages as arguments * Update the messages for mutiple languages, add messages for installed languages. Fix Codding standards --- src/Command/Locale/LanguageAddCommand.php | 127 +++++++++++++++++----- 1 file changed, 98 insertions(+), 29 deletions(-) diff --git a/src/Command/Locale/LanguageAddCommand.php b/src/Command/Locale/LanguageAddCommand.php index fd355743e..2db2a1936 100644 --- a/src/Command/Locale/LanguageAddCommand.php +++ b/src/Command/Locale/LanguageAddCommand.php @@ -35,15 +35,20 @@ class LanguageAddCommand extends Command */ protected $moduleHandler; + /** + * @var array + */ + protected $missingLangues = []; + /** * LanguageAddCommand constructor. * - * @param Site $site + * @param Site $site * @param ModuleHandlerInterface $moduleHandler */ public function __construct( - Site $site, - ModuleHandlerInterface $moduleHandler + Site $site, + ModuleHandlerInterface $moduleHandler ) { $this->site = $site; $this->moduleHandler = $moduleHandler; @@ -53,13 +58,13 @@ public function __construct( protected function configure() { $this - ->setName('locale:language:add') - ->setDescription($this->trans('commands.locale.language.add.description')) - ->addArgument( - 'language', - InputArgument::REQUIRED, - $this->trans('commands.locale.translation.status.arguments.language') - ); + ->setName('locale:language:add') + ->setDescription($this->trans('commands.locale.language.add.description')) + ->addArgument( + 'language', + InputArgument::REQUIRED | InputArgument::IS_ARRAY, + $this->trans('commands.locale.translation.status.arguments.language') + ); } protected function execute(InputInterface $input, OutputInterface $output) @@ -68,30 +73,46 @@ protected function execute(InputInterface $input, OutputInterface $output) $moduleHandler->loadInclude('locale', 'inc', 'locale.translation'); $moduleHandler->loadInclude('locale', 'module'); - $language = $input->getArgument('language'); - $languages = $this->site->getStandardLanguages(); - - if (isset($languages[$language])) { - $langcode = $language; - } elseif (array_search($language, $languages)) { - $langcode = array_search($language, $languages); - } else { - $this->getIo()->error( - sprintf( - $this->trans('commands.locale.language.add.messages.invalid-language'), - $language - ) - ); + $languageArguments = $this->checkLanguages($input->getArgument('language')); + $missingLanguages = $this->getMissingLangugaes(); + if (!empty($missingLanguages)) { + $translatableString = count($missingLanguages) == 1 ? 'commands.locale.language.add.messages.invalid-language' : 'commands.locale.language.add.messages.invalid-languages'; + $this->getIo()->error(sprintf( + $this->trans($translatableString), + implode(', ', $missingLanguages) + )); return 1; } try { - $language = ConfigurableLanguage::createFromLangcode($langcode); - $language->type = LOCALE_TRANSLATION_REMOTE; - $language->save(); - - $this->getIo()->info(sprintf($this->trans('commands.locale.language.add.messages.language-add-successfully'), $language->getName())); + $installedLanguages = []; + foreach (array_keys($languageArguments) as $langcode) { + if (!($language = ConfigurableLanguage::load($langcode))) { + $language = ConfigurableLanguage::createFromLangcode($langcode); + $language->type = LOCALE_TRANSLATION_REMOTE; + $language->save(); + } else { + $installedLanguages[] = $languageArguments[$langcode]; + unset($languageArguments[$langcode]); + } + } + + if (!empty($languageArguments)) { + $translatableString = count($languageArguments) == 1 ? 'commands.locale.language.add.messages.language-add-successfully' : 'commands.locale.language.add.messages.languages-add-successfully'; + $this->getIo()->info(sprintf( + $this->trans($translatableString), + implode(', ', $languageArguments) + )); + } + + if (!empty($installedLanguages)) { + $translatableString = count($installedLanguages) == 1 ? 'commands.locale.language.add.messages.language-installed' : 'commands.locale.language.add.messages.languages-installed'; + $this->getIo()->note(sprintf( + $this->trans($translatableString), + implode(', ', $installedLanguages) + )); + } } catch (\Exception $e) { $this->getIo()->error($e->getMessage()); @@ -100,4 +121,52 @@ protected function execute(InputInterface $input, OutputInterface $output) return 0; } + + /** + * Checks the existance of the languages in the system. + * + * @param array $languageArguments + * List of language arguments. + * + * @return array + * List of available languages. + */ + protected function checkLanguages($languageArguments) + { + $languages = $this->site->getStandardLanguages(); + $language_codes = array_keys($languages); + $buildLanguages = []; + foreach ($languageArguments as $language) { + if (array_search($language, $language_codes)) { + $buildLanguages[$language] = $languages[$language]; + } elseif ($language_code = array_search($language, $languages)) { + $buildLanguages[$language_code] = $language; + } else { + $this->addMissingLanguage($language); + } + } + return $buildLanguages; + } + + /** + * Add missing language. + * + * @param string $language + * Language code or name. + */ + private function addMissingLanguage($language) + { + $this->missingLangues[] = $language; + } + + /** + * Get list of missing languages. + * + * @return array + * Missing languges. + */ + private function getMissingLangugaes() + { + return $this->missingLangues; + } }