diff --git a/core/modules/locale/lib/Drupal/locale/Form/ImportForm.php b/core/modules/locale/lib/Drupal/locale/Form/ImportForm.php new file mode 100644 index 0000000..32afb37 --- /dev/null +++ b/core/modules/locale/lib/Drupal/locale/Form/ImportForm.php @@ -0,0 +1,191 @@ +get('module_handler'), + $container->get('language_manager') + ); + } + /** + * Constructs an ImportForm. + * + * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler + */ + public function __construct(ModuleHandlerInterface $module_handler, LanguageManager $language_manager) { + $this->moduleHandler = $module_handler; + $this->languageManager = $language_manager; + } + + /** + * {@inheritdoc} + */ + public function getFormID() { + return 'locale_translate_import_form'; + } + + /** + * Form constructor for the translation import screen. + * + * @ingroup forms + */ + public function buildForm(array $form, array &$form_state) { + $this->languageManager->reset(); + $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. + form_load_include($form_state, 'inc', 'language', 'language.admin'); + if (empty($existing_languages)) { + $language_options = language_admin_predefined_list(); + $default = key($language_options); + } + else { + $default = key($existing_languages); + $language_options = array( + $this->t('Existing languages') => $existing_languages, + $this->t('Languages not yet added') => language_admin_predefined_list() + ); + } + + $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, + ), + '#size' => 50, + '#upload_validators' => $validators, + '#attributes' => array('class' => array('file-import-input')), + '#attached' => array( + 'js' => array( + drupal_get_path('module', 'locale') . '/locale.bulk.js' => array(), + ), + ), + ); + $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( + '#type' => 'actions' + ); + $form['actions']['submit'] = array( + '#type' => 'submit', + '#value' => $this->t('Import') + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + // Ensure we have the file uploaded. + if ($file = file_save_upload('file', $form_state, $form['file']['#upload_validators'], 'translations://', 0)) { + + // Add language, if not yet supported. + $language = language_load($form_state['values']['langcode']); + if (empty($language)) { + $language = new Language(array( + 'id' => $form_state['values']['langcode'] + )); + $language = language_save($language); + drupal_set_message(t('The language %language has been created.', array('%language' => 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($file, $options); + $batch = locale_translate_batch_build(array($file->uri => $file), $options); + batch_set($batch); + } + else { + $this->setFormError('file', $form_state, $this->t('File to import not found.')); + $form_state['rebuild'] = TRUE; + return; + } + + $form_state['redirect_route']['route_name'] = 'locale.translate_page'; + } +} diff --git a/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php b/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php index 41857d0..6ce06a1 100644 --- a/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php +++ b/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php @@ -22,6 +22,16 @@ public function import() { } /** + * Wraps locale_translate_export_form(). + * + * @todo Remove locale_translate_export_form(). + */ + public function export() { + module_load_include('bulk.inc', 'locale'); + return drupal_get_form('locale_translate_export_form'); + } + + /** * Wraps locale_translation_status_form(). * * @todo Remove locale_translation_status_form(). diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc index e93469f..8012e80 100644 --- a/core/modules/locale/locale.bulk.inc +++ b/core/modules/locale/locale.bulk.inc @@ -10,96 +10,70 @@ use Drupal\file\FileInterface; /** - * Form constructor for the translation import screen. + * Form constructor for the Gettext translation files export form. * - * @see locale_translate_import_form_submit() + * @see locale_translate_export_form_submit() * @ingroup forms * - * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0. - * Use \Drupal\locale\Form\LocaleForm::import(). + * @deprecated Use \Drupal\locale\Form\LocaleForm::export() */ -function locale_translate_import_form($form, &$form_state) { - Drupal::languageManager()->reset(); - $languages = \Drupal::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(); +function locale_translate_export_form($form, &$form_state) { + $languages = language_list(); + $language_options = array(); foreach ($languages as $langcode => $language) { if ($langcode != 'en' || locale_translate_english()) { - $existing_languages[$langcode] = $language->name; + $language_options[$langcode] = $language->name; } } + $language_default = language_default(); - // 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. - form_load_include($form_state, 'inc', 'language', 'language.admin'); - if (empty($existing_languages)) { - $language_options = language_admin_predefined_list(); - $default = key($language_options); + if (empty($language_options)) { + $form['langcode'] = array( + '#type' => 'value', + '#value' => Language::LANGCODE_SYSTEM, + ); + $form['langcode_text'] = array( + '#type' => 'item', + '#title' => t('Language'), + '#markup' => t('No language available. The export will only contain source strings.'), + ); } else { - $default = key($existing_languages); - $language_options = array( - t('Existing languages') => $existing_languages, - t('Languages not yet added') => language_admin_predefined_list() + $form['langcode'] = array( + '#type' => 'select', + '#title' => t('Language'), + '#options' => $language_options, + '#default_value' => $language_default->id, + '#empty_option' => t('Source text only, no translations'), + '#empty_value' => Language::LANGCODE_SYSTEM, ); - } - - $validators = array( - 'file_validate_extensions' => array('po'), - 'file_validate_size' => array(file_upload_max_size()), - ); - $file_description = array( - '#theme' => 'file_upload_help', - '#description' => t('A Gettext Portable Object file.'), - '#upload_validators' => $validators, - ); - - $form['file'] = array( - '#type' => 'file', - '#title' => t('Translation file'), - '#description' => drupal_render($file_description), - '#size' => 50, - '#upload_validators' => $validators, - '#attributes' => array('class' => array('file-import-input')), - '#attached' => array( - 'js' => array( - drupal_get_path('module', 'locale') . '/locale.bulk.js' => array(), + $form['content_options'] = array( + '#type' => 'details', + '#title' => t('Export options'), + '#collapsed' => TRUE, + '#tree' => TRUE, + '#states' => array( + 'invisible' => array( + ':input[name="langcode"]' => array('value' => Language::LANGCODE_SYSTEM), + ), ), - ), - ); - $form['langcode'] = array( - '#type' => 'select', - '#title' => t('Language'), - '#options' => $language_options, - '#default_value' => $default, - '#attributes' => array('class' => array('langcode-input')), - ); - - $form['customized'] = array( - '#title' => t('Treat imported strings as custom translations'), - '#type' => 'checkbox', - ); - $form['overwrite_options'] = array( - '#type' => 'container', - '#tree' => TRUE, - ); - $form['overwrite_options']['not_customized'] = array( - '#title' => t('Overwrite non-customized translations'), - '#type' => 'checkbox', - '#states' => array( - 'checked' => array( - ':input[name="customized"]' => array('checked' => TRUE), - ), - ), - ); - $form['overwrite_options']['customized'] = array( - '#title' => t('Overwrite existing customized translations'), - '#type' => 'checkbox', - ); - + ); + $form['content_options']['not_customized'] = array( + '#type' => 'checkbox', + '#title' => t('Include non-customized translations'), + '#default_value' => TRUE, + ); + $form['content_options']['customized'] = array( + '#type' => 'checkbox', + '#title' => t('Include customized translations'), + '#default_value' => TRUE, + ); + $form['content_options']['not_translated'] = array( + '#type' => 'checkbox', + '#title' => t('Include untranslated text'), + '#default_value' => TRUE, + ); + } $form['actions'] = array( '#type' => 'actions' ); @@ -111,38 +85,56 @@ function locale_translate_import_form($form, &$form_state) { } /** - * Form submission handler for locale_translate_import_form(). + * Form submission handler for locale_translate_export_form(). */ -function locale_translate_import_form_submit($form, &$form_state) { - // Ensure we have the file uploaded. - if ($file = file_save_upload('file', $form['file']['#upload_validators'], 'translations://', 0)) { - - // Add language, if not yet supported. - $language = \Drupal::languageManager()->getLanguage($form_state['values']['langcode']); - if (empty($language)) { - $language = new Language(array( - 'id' => $form_state['values']['langcode'] - )); - $language = language_save($language); - drupal_set_message(t('The language %language has been created.', array('%language' => 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, - ); - $file = locale_translate_file_attach_properties($file, $options); - $batch = locale_translate_batch_build(array($file->uri => $file), $options); - batch_set($batch); +function locale_translate_export_form_submit($form, &$form_state) { + // If template is required, language code is not given. + if ($form_state['values']['langcode'] != Language::LANGCODE_SYSTEM) { + $language = language_load($form_state['values']['langcode']); + } + else { + $language = NULL; + } + $content_options = isset($form_state['values']['content_options']) ? $form_state['values']['content_options'] : array(); + $reader = new PoDatabaseReader(); + $languageName = ''; + if ($language != NULL) { + $reader->setLangcode($language->id); + $reader->setOptions($content_options); + $languages = language_list(); + $languageName = isset($languages[$language->id]) ? $languages[$language->id]->name : ''; + $filename = $language->id .'.po'; } else { - drupal_set_message(t('File to import not found.'), 'error'); - $form_state['rebuild'] = TRUE; - return; + // Template required. + $filename = 'drupal.pot'; } - $form_state['redirect_route']['route_name'] = 'locale.translate_page'; - return; + $item = $reader->readItem(); + if (!empty($item)) { + $uri = tempnam('temporary://', 'po_'); + $header = $reader->getHeader(); + $header->setProjectName(\Drupal::config('system.site')->get('name')); + $header->setLanguageName($languageName); + + $writer = new PoStreamWriter; + $writer->setUri($uri); + $writer->setHeader($header); + + $writer->open(); + $writer->writeItem($item); + $writer->writeItems($reader); + $writer->close(); + + $response = new BinaryFileResponse($uri); + $response->setContentDisposition('attachment', $filename); + // @todo remove lines below once converted to new routing system. + $response->prepare(\Drupal::request()) + ->send(); + } + else { + drupal_set_message('Nothing to export.'); + } } /** diff --git a/core/modules/locale/locale.routing.yml b/core/modules/locale/locale.routing.yml index 6658dad..705d5ea 100644 --- a/core/modules/locale/locale.routing.yml +++ b/core/modules/locale/locale.routing.yml @@ -24,7 +24,7 @@ locale.translate_page: locale.translate_import: path: '/admin/config/regional/translate/import' defaults: - _content: '\Drupal\locale\Form\LocaleForm::import' + _form: '\Drupal\locale\Form\ImportForm' _title: 'Import' requirements: _permission: 'translate interface'