Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / locale / src / Form / ExportForm.php
1 <?php
2
3 namespace Drupal\locale\Form;
4
5 use Drupal\Component\Gettext\PoStreamWriter;
6 use Drupal\Core\File\FileSystemInterface;
7 use Drupal\Core\Form\FormBase;
8 use Drupal\Core\Form\FormStateInterface;
9 use Drupal\Core\Language\LanguageInterface;
10 use Drupal\Core\Language\LanguageManagerInterface;
11 use Drupal\locale\PoDatabaseReader;
12 use Symfony\Component\DependencyInjection\ContainerInterface;
13 use Symfony\Component\HttpFoundation\BinaryFileResponse;
14
15 /**
16  * Form for the Gettext translation files export form.
17  */
18 class ExportForm extends FormBase {
19
20   /**
21    * The language manager.
22    *
23    * @var \Drupal\Core\Language\LanguageManagerInterface
24    */
25   protected $languageManager;
26
27   /**
28    * The file system service.
29    *
30    * @var \Drupal\Core\File\FileSystemInterface
31    */
32   protected $fileSystem;
33
34   /**
35    * Constructs a new ExportForm.
36    *
37    * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
38    *   The language manager.
39    * @param \Drupal\Core\File\FileSystemInterface $file_system
40    *   The file system service.
41    */
42   public function __construct(LanguageManagerInterface $language_manager, FileSystemInterface $file_system) {
43     $this->languageManager = $language_manager;
44     $this->fileSystem = $file_system;
45   }
46
47   /**
48    * {@inheritdoc}
49    */
50   public static function create(ContainerInterface $container) {
51     return new static(
52       $container->get('language_manager'),
53       $container->get('file_system')
54     );
55   }
56
57   /**
58    * {@inheritdoc}
59    */
60   public function getFormId() {
61     return 'locale_translate_export_form';
62   }
63
64   /**
65    * {@inheritdoc}
66    */
67   public function buildForm(array $form, FormStateInterface $form_state) {
68     $languages = $this->languageManager->getLanguages();
69     $language_options = [];
70     foreach ($languages as $langcode => $language) {
71       if (locale_is_translatable($langcode)) {
72         $language_options[$langcode] = $language->getName();
73       }
74     }
75     $language_default = $this->languageManager->getDefaultLanguage();
76
77     if (empty($language_options)) {
78       $form['langcode'] = [
79         '#type' => 'value',
80         '#value' => LanguageInterface::LANGCODE_SYSTEM,
81       ];
82       $form['langcode_text'] = [
83         '#type' => 'item',
84         '#title' => $this->t('Language'),
85         '#markup' => $this->t('No language available. The export will only contain source strings.'),
86       ];
87     }
88     else {
89       $form['langcode'] = [
90         '#type' => 'select',
91         '#title' => $this->t('Language'),
92         '#options' => $language_options,
93         '#default_value' => $language_default->getId(),
94         '#empty_option' => $this->t('Source text only, no translations'),
95         '#empty_value' => LanguageInterface::LANGCODE_SYSTEM,
96       ];
97       $form['content_options'] = [
98         '#type' => 'details',
99         '#title' => $this->t('Export options'),
100         '#tree' => TRUE,
101         '#states' => [
102           'invisible' => [
103             ':input[name="langcode"]' => ['value' => LanguageInterface::LANGCODE_SYSTEM],
104           ],
105         ],
106       ];
107       $form['content_options']['not_customized'] = [
108         '#type' => 'checkbox',
109         '#title' => $this->t('Include non-customized translations'),
110         '#default_value' => TRUE,
111       ];
112       $form['content_options']['customized'] = [
113         '#type' => 'checkbox',
114         '#title' => $this->t('Include customized translations'),
115         '#default_value' => TRUE,
116       ];
117       $form['content_options']['not_translated'] = [
118         '#type' => 'checkbox',
119         '#title' => $this->t('Include untranslated text'),
120         '#default_value' => TRUE,
121       ];
122     }
123
124     $form['actions'] = [
125       '#type' => 'actions',
126     ];
127     $form['actions']['submit'] = [
128       '#type' => 'submit',
129       '#value' => $this->t('Export'),
130     ];
131     return $form;
132   }
133
134   /**
135    * {@inheritdoc}
136    */
137   public function submitForm(array &$form, FormStateInterface $form_state) {
138     // If template is required, language code is not given.
139     if ($form_state->getValue('langcode') != LanguageInterface::LANGCODE_SYSTEM) {
140       $language = $this->languageManager->getLanguage($form_state->getValue('langcode'));
141     }
142     else {
143       $language = NULL;
144     }
145     $content_options = $form_state->getValue('content_options', []);
146     $reader = new PoDatabaseReader();
147     $language_name = '';
148     if ($language != NULL) {
149       $reader->setLangcode($language->getId());
150       $reader->setOptions($content_options);
151       $languages = $this->languageManager->getLanguages();
152       $language_name = isset($languages[$language->getId()]) ? $languages[$language->getId()]->getName() : '';
153       $filename = $language->getId() . '.po';
154     }
155     else {
156       // Template required.
157       $filename = 'drupal.pot';
158     }
159
160     $item = $reader->readItem();
161     if (!empty($item)) {
162       $uri = $this->fileSystem->tempnam('temporary://', 'po_');
163       $header = $reader->getHeader();
164       $header->setProjectName($this->config('system.site')->get('name'));
165       $header->setLanguageName($language_name);
166
167       $writer = new PoStreamWriter();
168       $writer->setURI($uri);
169       $writer->setHeader($header);
170
171       $writer->open();
172       $writer->writeItem($item);
173       $writer->writeItems($reader);
174       $writer->close();
175
176       $response = new BinaryFileResponse($uri);
177       $response->setContentDisposition('attachment', $filename);
178       $form_state->setResponse($response);
179     }
180     else {
181       drupal_set_message($this->t('Nothing to export.'));
182     }
183   }
184
185 }