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.
18 class ExportForm extends FormBase {
21 * The language manager.
23 * @var \Drupal\Core\Language\LanguageManagerInterface
25 protected $languageManager;
28 * The file system service.
30 * @var \Drupal\Core\File\FileSystemInterface
32 protected $fileSystem;
35 * Constructs a new ExportForm.
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.
42 public function __construct(LanguageManagerInterface $language_manager, FileSystemInterface $file_system) {
43 $this->languageManager = $language_manager;
44 $this->fileSystem = $file_system;
50 public static function create(ContainerInterface $container) {
52 $container->get('language_manager'),
53 $container->get('file_system')
60 public function getFormId() {
61 return 'locale_translate_export_form';
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();
75 $language_default = $this->languageManager->getDefaultLanguage();
77 if (empty($language_options)) {
80 '#value' => LanguageInterface::LANGCODE_SYSTEM,
82 $form['langcode_text'] = [
84 '#title' => $this->t('Language'),
85 '#markup' => $this->t('No language available. The export will only contain source strings.'),
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,
97 $form['content_options'] = [
99 '#title' => $this->t('Export options'),
103 ':input[name="langcode"]' => ['value' => LanguageInterface::LANGCODE_SYSTEM],
107 $form['content_options']['not_customized'] = [
108 '#type' => 'checkbox',
109 '#title' => $this->t('Include non-customized translations'),
110 '#default_value' => TRUE,
112 $form['content_options']['customized'] = [
113 '#type' => 'checkbox',
114 '#title' => $this->t('Include customized translations'),
115 '#default_value' => TRUE,
117 $form['content_options']['not_translated'] = [
118 '#type' => 'checkbox',
119 '#title' => $this->t('Include untranslated text'),
120 '#default_value' => TRUE,
125 '#type' => 'actions',
127 $form['actions']['submit'] = [
129 '#value' => $this->t('Export'),
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'));
145 $content_options = $form_state->getValue('content_options', []);
146 $reader = new PoDatabaseReader();
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';
156 // Template required.
157 $filename = 'drupal.pot';
160 $item = $reader->readItem();
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);
167 $writer = new PoStreamWriter();
168 $writer->setURI($uri);
169 $writer->setHeader($header);
172 $writer->writeItem($item);
173 $writer->writeItems($reader);
176 $response = new BinaryFileResponse($uri);
177 $response->setContentDisposition('attachment', $filename);
178 $form_state->setResponse($response);
181 drupal_set_message($this->t('Nothing to export.'));