3 namespace Drupal\locale\Form;
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;
16 * Form for the Gettext translation files export form.
20 class ExportForm extends FormBase {
23 * The language manager.
25 * @var \Drupal\Core\Language\LanguageManagerInterface
27 protected $languageManager;
30 * The file system service.
32 * @var \Drupal\Core\File\FileSystemInterface
34 protected $fileSystem;
37 * Constructs a new ExportForm.
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.
44 public function __construct(LanguageManagerInterface $language_manager, FileSystemInterface $file_system) {
45 $this->languageManager = $language_manager;
46 $this->fileSystem = $file_system;
52 public static function create(ContainerInterface $container) {
54 $container->get('language_manager'),
55 $container->get('file_system')
62 public function getFormId() {
63 return 'locale_translate_export_form';
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();
77 $language_default = $this->languageManager->getDefaultLanguage();
79 if (empty($language_options)) {
82 '#value' => LanguageInterface::LANGCODE_SYSTEM,
84 $form['langcode_text'] = [
86 '#title' => $this->t('Language'),
87 '#markup' => $this->t('No language available. The export will only contain source strings.'),
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,
99 $form['content_options'] = [
100 '#type' => 'details',
101 '#title' => $this->t('Export options'),
105 ':input[name="langcode"]' => ['value' => LanguageInterface::LANGCODE_SYSTEM],
109 $form['content_options']['not_customized'] = [
110 '#type' => 'checkbox',
111 '#title' => $this->t('Include non-customized translations'),
112 '#default_value' => TRUE,
114 $form['content_options']['customized'] = [
115 '#type' => 'checkbox',
116 '#title' => $this->t('Include customized translations'),
117 '#default_value' => TRUE,
119 $form['content_options']['not_translated'] = [
120 '#type' => 'checkbox',
121 '#title' => $this->t('Include untranslated text'),
122 '#default_value' => TRUE,
127 '#type' => 'actions',
129 $form['actions']['submit'] = [
131 '#value' => $this->t('Export'),
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'));
147 $content_options = $form_state->getValue('content_options', []);
148 $reader = new PoDatabaseReader();
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';
158 // Template required.
159 $filename = 'drupal.pot';
162 $item = $reader->readItem();
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);
169 $writer = new PoStreamWriter();
170 $writer->setURI($uri);
171 $writer->setHeader($header);
174 $writer->writeItem($item);
175 $writer->writeItems($reader);
178 $response = new BinaryFileResponse($uri);
179 $response->setContentDisposition('attachment', $filename);
180 $form_state->setResponse($response);
183 $this->messenger()->addStatus($this->t('Nothing to export.'));