'Checks for available translation updates.', 'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_FULL, ]; $items['locale-update'] = [ 'description' => 'Updates the available translations.', 'options' => [ 'langcodes' => 'A comma-separated list of language codes to update. If omitted, all translations will be updated.' ], 'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_FULL, ]; // @todo Implement proper export and import commands. return $items; } /** * Checks for available translation updates. * * @see \Drupal\locale\Controller\LocaleController::checkTranslation() * * @todo This can be simplified once https://www.drupal.org/node/2631584 lands * in Drupal core. */ function drush_locale_check() { \Drupal::moduleHandler()->loadInclude('locale', 'inc', 'locale.compare'); // Check translation status of all translatable project in all languages. // First we clear the cached list of projects. Although not strictly // necessary, this is helpful in case the project list is out of sync. locale_translation_flush_projects(); locale_translation_check_projects(); // Execute a batch if required. A batch is only used when remote files // are checked. if (batch_get()) { drush_backend_batch_process(); } } /** * Imports the available translation updates. * * @see TranslationStatusForm::buildForm() * @see TranslationStatusForm::prepareUpdateData() * @see TranslationStatusForm::submitForm() * * @todo This can be simplified once https://www.drupal.org/node/2631584 lands * in Drupal core. */ function drush_locale_update() { $module_handler = \Drupal::moduleHandler(); $module_handler->loadInclude('locale', 'fetch.inc'); $module_handler->loadInclude('locale', 'bulk.inc'); $langcodes = []; foreach (locale_translation_get_status() as $project_id => $project) { foreach ($project as $langcode => $project_info) { if (!empty($project_info->type)) { $langcodes[] = $langcode; } } } if ($passed_langcodes = drush_get_option('langcodes')) { $langcodes = array_intersect($langcodes, explode(',', $passed_langcodes)); // @todo Not selecting any language code in the user interface results in // all translations being updated, so we mimick that behavior here. } // Deduplicate the list of langcodes since each project may have added the // same language several times. $langcodes = array_unique($langcodes); // @todo Restricting by projects is not possible in the user interface and is // broken when attempting to do it in a hook_form_alter() implementation so // we do not allow for it here either. $projects = []; // Set the translation import options. This determines if existing // translations will be overwritten by imported strings. $options = _locale_translation_default_update_options(); // If the status was updated recently we can immediately start fetching the // translation updates. If the status is expired we clear it an run a batch to // update the status and then fetch the translation updates. $last_checked = \Drupal::state()->get('locale.translation_last_checked'); if ($last_checked < REQUEST_TIME - LOCALE_TRANSLATION_STATUS_TTL) { locale_translation_clear_status(); $batch = locale_translation_batch_update_build(array(), $langcodes, $options); batch_set($batch); } else { // Set a batch to download and import translations. $batch = locale_translation_batch_fetch_build($projects, $langcodes, $options); batch_set($batch); // Set a batch to update configuration as well. if ($batch = locale_config_batch_update_components($options, $langcodes)) { batch_set($batch); } } drush_backend_batch_process(); }