ImportForm.php 6.05 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
<?php

/**
 * @file
 * Contains \Drupal\locale\Form\ImportForm.
 */

namespace Drupal\locale\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Extension\ModuleHandlerInterface;
12
use Drupal\Core\Form\FormStateInterface;
13
use Drupal\Core\Language\Language;
14
use Drupal\language\ConfigurableLanguageManagerInterface;
15 16 17 18 19
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Form constructor for the translation import screen.
 */
20
class ImportForm extends FormBase {
21 22 23 24 25 26 27

  /**
   * Uploaded file entity.
   *
   * @var \Drupal\file\Entity\File
   */
  protected $file;
28

29 30 31 32 33 34 35 36
  /**
   * The module handler service.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
37
   * The configurable language manager.
38
   *
39
   * @var \Drupal\language\ConfigurableLanguageManagerInterface
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
   */
  protected $languageManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler'),
      $container->get('language_manager')
    );
  }
  /**
   * Constructs a form for language import.
   *
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler service.
57 58
   * @param \Drupal\language\ConfigurableLanguageManagerInterface $language_manager
   *   The configurable language manager.
59
   */
60
  public function __construct(ModuleHandlerInterface $module_handler, ConfigurableLanguageManagerInterface $language_manager) {
61 62 63 64 65 66 67 68 69 70 71 72 73 74
    $this->moduleHandler = $module_handler;
    $this->languageManager = $language_manager;
  }

  /**
   * {@inheritdoc}
   */
  public function getFormID() {
    return 'locale_translate_import_form';
  }

  /**
   * Form constructor for the translation import screen.
   */
75
  public function buildForm(array $form, FormStateInterface $form_state) {
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    $languages = $this->languageManager->getLanguages();

    // Initialize a language list to the ones available, including English if we
    // are to translate Drupal to English as well.
    $existing_languages = array();
    foreach ($languages as $langcode => $language) {
      if ($langcode != 'en' || locale_translate_english()) {
        $existing_languages[$langcode] = $language->name;
      }
    }

    // If we have no languages available, present the list of predefined
    // languages only. If we do have already added languages, set up two option
    // groups with the list of existing and then predefined languages.
    if (empty($existing_languages)) {
91
      $language_options = $this->languageManager->getStandardLanguageListWithoutConfigured();
92 93 94 95 96 97
      $default = key($language_options);
    }
    else {
      $default = key($existing_languages);
      $language_options = array(
        $this->t('Existing languages') => $existing_languages,
98
        $this->t('Languages not yet added') => $this->languageManager->getStandardLanguageListWithoutConfigured(),
99 100 101 102 103 104 105 106 107 108 109 110 111 112
      );
    }

    $validators = array(
      'file_validate_extensions' => array('po'),
      'file_validate_size' => array(file_upload_max_size()),
    );
    $form['file'] = array(
      '#type' => 'file',
      '#title' => $this->t('Translation file'),
      '#description' => array(
        '#theme' => 'file_upload_help',
        '#description' => $this->t('A Gettext Portable Object file.'),
        '#upload_validators' => $validators,
113
      ),
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
      '#size' => 50,
      '#upload_validators' => $validators,
      '#attributes' => array('class' => array('file-import-input')),
    );
    $form['langcode'] = array(
      '#type' => 'select',
      '#title' => $this->t('Language'),
      '#options' => $language_options,
      '#default_value' => $default,
      '#attributes' => array('class' => array('langcode-input')),
    );

    $form['customized'] = array(
      '#title' => $this->t('Treat imported strings as custom translations'),
      '#type' => 'checkbox',
    );
    $form['overwrite_options'] = array(
      '#type' => 'container',
      '#tree' => TRUE,
    );
    $form['overwrite_options']['not_customized'] = array(
      '#title' => $this->t('Overwrite non-customized translations'),
      '#type' => 'checkbox',
      '#states' => array(
        'checked' => array(
          ':input[name="customized"]' => array('checked' => TRUE),
        ),
      ),
    );
    $form['overwrite_options']['customized'] = array(
      '#title' => $this->t('Overwrite existing customized translations'),
      '#type' => 'checkbox',
    );

    $form['actions'] = array(
149
      '#type' => 'actions',
150 151 152
    );
    $form['actions']['submit'] = array(
      '#type' => 'submit',
153
      '#value' => $this->t('Import'),
154 155 156 157 158 159 160
    );
    return $form;
  }

  /**
   * {@inheritdoc}
   */
161
  public function validateForm(array &$form, FormStateInterface $form_state) {
162 163 164 165 166 167 168 169 170 171 172
    $this->file = file_save_upload('file', $form['file']['#upload_validators'], 'translations://', 0);

    // Ensure we have the file uploaded.
    if (!$this->file) {
      $this->setFormError('file', $form_state, $this->t('File to import not found.'));
    }
  }

  /**
   * {@inheritdoc}
   */
173
  public function submitForm(array &$form, FormStateInterface $form_state) {
174 175 176 177
    // Add language, if not yet supported.
    $language = $this->languageManager->getLanguage($form_state['values']['langcode']);
    if (empty($language)) {
      $language = new Language(array(
178
        'id' => $form_state['values']['langcode'],
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
      ));
      $language = language_save($language);
      drupal_set_message($this->t('The language %language has been created.', array('%language' => $this->t($language->name))));
    }
    $options = array(
      'langcode' => $form_state['values']['langcode'],
      'overwrite_options' => $form_state['values']['overwrite_options'],
      'customized' => $form_state['values']['customized'] ? LOCALE_CUSTOMIZED : LOCALE_NOT_CUSTOMIZED,
    );
    $this->moduleHandler->loadInclude('locale', 'bulk.inc');
    $file = locale_translate_file_attach_properties($this->file, $options);
    $batch = locale_translate_batch_build(array($file->uri => $file), $options);
    batch_set($batch);

    $form_state['redirect_route']['route_name'] = 'locale.translate_page';
  }
}