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 aaa0bfa..c06a4aa 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 5f72ad8..abaec2b 100644 --- a/core/modules/locale/locale.bulk.inc +++ b/core/modules/locale/locale.bulk.inc @@ -99,13 +99,80 @@ function locale_translate_import_form($form, &$form_state) { '#title' => t('Overwrite existing customized translations'), '#type' => 'checkbox', ); +} +/** + * Form constructor for the Gettext translation files export form. + * + * @see locale_translate_export_form_submit() + * @ingroup forms + * + * @deprecated Use \Drupal\locale\Form\LocaleForm::export() + */ +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()) { + $language_options[$langcode] = $language->name; + } + } + $language_default = language_default(); + + 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 { + $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, + ); + $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['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' ); $form['actions']['submit'] = array( '#type' => 'submit', - '#value' => t('Import') + //'#value' => t('Import'), + '#value' => t('Export') ); return $form; } @@ -146,6 +213,59 @@ function locale_translate_import_form_submit($form, &$form_state) { } /** + * Form submission handler for locale_translate_export_form(). + */ +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 { + // Template required. + $filename = 'drupal.pot'; + } + + $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.'); + } +} + +/** * Prepare a batch to import all translations. * * @param array $options 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'