2db2a1936ad174512bec37f546a304605bf146f5
[yaffs-website] / vendor / drupal / console / src / Command / Locale / LanguageAddCommand.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\Console\Command\Locale\LanguageAddCommand.
6  */
7
8 namespace Drupal\Console\Command\Locale;
9
10 use Symfony\Component\Console\Input\InputArgument;
11 use Symfony\Component\Console\Input\InputInterface;
12 use Symfony\Component\Console\Output\OutputInterface;
13 use Drupal\language\Entity\ConfigurableLanguage;
14 use Drupal\Console\Core\Command\Command;
15 use Drupal\Core\Extension\ModuleHandlerInterface;
16 use Drupal\Console\Utils\Site;
17 use Drupal\Console\Annotations\DrupalCommand;
18
19 /**
20  * @DrupalCommand(
21  *     extension = "locale",
22  *     extensionType = "module"
23  * )
24  */
25 class LanguageAddCommand extends Command
26 {
27
28     /**
29      * @var Site
30      */
31     protected $site;
32
33     /**
34      * @var ModuleHandlerInterface
35      */
36     protected $moduleHandler;
37
38     /**
39      * @var array
40      */
41     protected $missingLangues = [];
42
43     /**
44      * LanguageAddCommand constructor.
45      *
46      * @param Site $site
47      * @param ModuleHandlerInterface $moduleHandler
48      */
49     public function __construct(
50       Site $site,
51       ModuleHandlerInterface $moduleHandler
52     ) {
53         $this->site = $site;
54         $this->moduleHandler = $moduleHandler;
55         parent::__construct();
56     }
57
58     protected function configure()
59     {
60         $this
61           ->setName('locale:language:add')
62           ->setDescription($this->trans('commands.locale.language.add.description'))
63           ->addArgument(
64             'language',
65             InputArgument::REQUIRED | InputArgument::IS_ARRAY,
66             $this->trans('commands.locale.translation.status.arguments.language')
67           );
68     }
69
70     protected function execute(InputInterface $input, OutputInterface $output)
71     {
72         $moduleHandler = $this->moduleHandler;
73         $moduleHandler->loadInclude('locale', 'inc', 'locale.translation');
74         $moduleHandler->loadInclude('locale', 'module');
75
76         $languageArguments = $this->checkLanguages($input->getArgument('language'));
77         $missingLanguages = $this->getMissingLangugaes();
78         if (!empty($missingLanguages)) {
79             $translatableString = count($missingLanguages) == 1 ? 'commands.locale.language.add.messages.invalid-language' : 'commands.locale.language.add.messages.invalid-languages';
80             $this->getIo()->error(sprintf(
81               $this->trans($translatableString),
82               implode(', ', $missingLanguages)
83             ));
84
85             return 1;
86         }
87
88         try {
89             $installedLanguages = [];
90             foreach (array_keys($languageArguments) as $langcode) {
91                 if (!($language = ConfigurableLanguage::load($langcode))) {
92                     $language = ConfigurableLanguage::createFromLangcode($langcode);
93                     $language->type = LOCALE_TRANSLATION_REMOTE;
94                     $language->save();
95                 } else {
96                     $installedLanguages[] = $languageArguments[$langcode];
97                     unset($languageArguments[$langcode]);
98                 }
99             }
100
101             if (!empty($languageArguments)) {
102                 $translatableString = count($languageArguments) == 1 ? 'commands.locale.language.add.messages.language-add-successfully' : 'commands.locale.language.add.messages.languages-add-successfully';
103                 $this->getIo()->info(sprintf(
104                   $this->trans($translatableString),
105                   implode(', ', $languageArguments)
106                 ));
107             }
108
109             if (!empty($installedLanguages)) {
110                 $translatableString = count($installedLanguages) == 1 ? 'commands.locale.language.add.messages.language-installed' : 'commands.locale.language.add.messages.languages-installed';
111                 $this->getIo()->note(sprintf(
112                   $this->trans($translatableString),
113                   implode(', ', $installedLanguages)
114                 ));
115             }
116         } catch (\Exception $e) {
117             $this->getIo()->error($e->getMessage());
118
119             return 1;
120         }
121
122         return 0;
123     }
124
125     /**
126      * Checks the existance of the languages in the system.
127      *
128      * @param array $languageArguments
129      *   List of language arguments.
130      *
131      * @return array
132      *   List of available languages.
133      */
134     protected function checkLanguages($languageArguments)
135     {
136         $languages = $this->site->getStandardLanguages();
137         $language_codes = array_keys($languages);
138         $buildLanguages = [];
139         foreach ($languageArguments as $language) {
140             if (array_search($language, $language_codes)) {
141                 $buildLanguages[$language] = $languages[$language];
142             } elseif ($language_code = array_search($language, $languages)) {
143                 $buildLanguages[$language_code] = $language;
144             } else {
145                 $this->addMissingLanguage($language);
146             }
147         }
148         return $buildLanguages;
149     }
150
151     /**
152      * Add missing language.
153      *
154      * @param string $language
155      *   Language code or name.
156      */
157     private function addMissingLanguage($language)
158     {
159         $this->missingLangues[] = $language;
160     }
161
162     /**
163      * Get list of missing languages.
164      *
165      * @return array
166      *   Missing languges.
167      */
168     private function getMissingLangugaes()
169     {
170         return $this->missingLangues;
171     }
172 }