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