'value', '#value' => $updates); $form['lang'] = array( '#type' => 'fieldset', '#title' => t('Languages'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#description' => t('Select one or more languages to download and update. If you select none, all of them will be updated.'), ); $form['lang']['languages'] = array( '#type' => 'checkboxes', '#options' => $languages, ); $form['mode'] = array('#type' => 'radios', '#title' => t('Update mode'), '#default_value' => variable_get('l10n_update_import_mode', LOCALE_IMPORT_KEEP), '#options' => _l10n_update_admin_import_options(), ); $form['buttons']['download'] = array('#type' => 'submit', '#value' => t('Update translations')); $form['buttons']['refresh'] = array('#type' => 'submit', '#value' => t('Refresh information')); } else { $form['warning'] = array('#value' => t('No projects or languages to update.')); } return $form; } /** * Submit handler for Update form. * * Handles both submit buttons to update translations and to update the * form information. */ function l10n_update_admin_import_form_submit($form, $form_state) { $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : ''; $projects = l10n_update_get_projects(); if ($op == t('Update translations')) { $languages = array_filter($form_state['values']['languages']); $updates = $form_state['values']['updates']; $mode = $form_state['values']['mode']; if ($projects && $updates) { module_load_include('batch.inc', 'l10n_update'); // Filter out updates in other languages. If no languages, all of them will be updated $updates = _l10n_update_prepare_updates($updates, NULL, $languages); $batch = l10n_update_batch_multiple($updates, $mode); batch_set($batch); } else { drupal_set_message(t('Cannot find any translation updates.'), 'error'); } } elseif ($op == t('Refresh information')) { l10n_update_build_projects(); // Get available translation updates and update file history. if ($available = l10n_update_available_releases(TRUE)) { l10n_update_flag_history($available); drupal_set_message(t('Fetched information about available updates from the server')); } else { drupal_set_message(t('Failed to fetch information about available updates from the server'), 'error'); } } } /** * Page callback: Settings form. */ function l10n_update_admin_settings_form() { $form['l10n_update_check_mode'] = array('#type' => 'radios', '#title' => t('Update source'), '#default_value' => variable_get('l10n_update_check_mode', L10N_UPDATE_CHECK_ALL), '#options' => _l10n_update_admin_check_options(), ); $form['l10n_update_import_mode'] = array('#type' => 'radios', '#title' => t('Update mode'), '#default_value' => variable_get('l10n_update_import_mode', LOCALE_IMPORT_KEEP), '#options' => _l10n_update_admin_import_options(), ); $form['l10n_update_check_frequency'] = array( '#type' => 'radios', '#title' => t('Check for updates'), '#default_value' => variable_get('l10n_update_check_frequency', 0), '#options' => array( 0 => t('Never (manually)'), 1 => t('Daily'), 7 => t('Weekly'), ), '#description' => t('Select how frequently you want to automatically check for updated translations for installed modules and themes.'), ); $form['l10n_update_check_disabled'] = array( '#type' => 'checkbox', '#title' => t('Check for updates of disabled modules and themes'), '#default_value' => variable_get('l10n_update_check_disabled', 0), '#description' => t('Note that this comes with a performance penalty, so it is not recommended.'), ); $form['l10n_update_download_store'] = array( '#title' => t('Store downloaded files'), '#type' => 'textfield', '#default_value' => variable_get('l10n_update_download_store', ''), '#description' => t('A path relative to the Drupal installation directory where translation files will be stored, e.g. sites/all/translations. Saved translation files can be reused by other installations. If left empty the downloaded translation will not be saved.'), ); return system_settings_form($form); } /** * Additional validation handler for update settings. * * Check for existing files directory and creates one when required. */ function l10n_update_admin_settings_form_validate($form, &$form_state) { $form_values = $form_state['values']; if ( ! empty($form_values['l10n_update_download_store'])) { file_check_directory($form_values['l10n_update_download_store'], FILE_CREATE_DIRECTORY, 'l10n_update_download_store'); } } /** * Get array of import options. * * The import options of the Locale module are used but the UI text is altered * to suit the Localization update cases. * * @return * Keyed array of import options. */ function _l10n_update_admin_import_options() { return array( LOCALE_IMPORT_OVERWRITE => t('Translation updates replace existing ones, new ones are added'), LOCALE_UPDATE_OVERRIDE_DEFAULT => t('Edited translations are kept, only previously imported ones are overwritten and new translations are added'), LOCALE_IMPORT_KEEP => t('All existing translations are kept, only new translations are added.'), ); } /** * Get array of check options. * * @return * Keyed array of source download options. */ function _l10n_update_admin_check_options() { return array( L10N_UPDATE_CHECK_ALL => t('Local files and remote server.'), L10N_UPDATE_CHECK_LOCAL => t('Local files only.'), L10N_UPDATE_CHECK_REMOTE => t('Remote server only.'), ); } /** * Format project update status. * * @params array $projects * Projects listed. * @params array $languages * Languages listed. * @params array $history * Project translation history. * @params array $available * Available translation releases. * @params array $updates * Applicable translation updates. * * @return string * HTML output. */ function theme_l10n_update_project_status($projects, $languages, $history, $available, $updates) { // We use the core update module CSS drupal_add_css(drupal_get_path('module', 'update') .'/update.css'); $output = ''; //$header = array(t('Project'), t('Current version'), t('Available update'), ''); $header = $rows = array(); foreach ($projects as $name => $project) { $row = '
'; if (empty($available[$name])) { // Remote information not checked $status = 'unknown'; $class = 'unknown'; } elseif (empty($updates[$name])) { // No updates available $status = 'ok'; $class = 'ok'; } else { // Update available $status = 'update'; $class = 'warning'; } $row = theme('l10n_update_version_status', $status); $row .= "
"; $title = isset($project->title) ? $project->title : $project->name; $row .= check_plain($title); $row .= ' ' . check_plain(isset($project->info['version']) ? $project->info['version'] : $project->version); if ($server = l10n_update_server($project->l10n_server)) { $row .= ' ' . l($server['name'], $server['link']); } $row .= "
\n"; $row .= "
\n"; $versions = array(); foreach ($languages as $lang => $language) { $current = isset($history[$name][$lang]) ? $history[$name][$lang] : NULL; //$installed = isset($history[$name][$lang]) ? $history[$name][$lang] : NULL; $update = isset($updates[$name][$lang]) ? $updates[$name][$lang] : NULL; if ($update) { $status = 'update'; $class = 'warning'; } elseif ($current) { $status = $class = 'ok'; } else { $status = $class ='unknown'; } $version = array( array('data' => $language, 'class' => 'version-title'), $current ? theme('l10n_update_release', $current) : '', $update ? theme('l10n_update_release', $update) : '', theme('l10n_update_version_status', $status, $update ? $update->type : NULL), ); $versions[] = array('data' => $version, 'class' => $class); } $row .= theme('table', array(), $versions); $row .= "
\n"; $rows[] = array($row); } $output .= theme('table', $header, $rows, array('class' => 'update')); return $output; } /** * Format tag and release date. * * @param object $release * Source file data. * @return string * HTML output. */ function theme_l10n_update_release($release) { $name = $release->filename; $date = $release->timestamp; if (!empty($release->fileurl)) { // Remote file, straight link $link = l($name, $release->fileurl); } elseif (!empty($release->filepath)) { // Local file, try something $link = l($name, $release->filepath, array('absolute' => TRUE)); } else { // No link $link = "$name"; } return $link . '
' . format_date($date, 'short') . ''; } /** * Format version status with icon. * * @param string $status * Version status: 'ok', 'update', 'unknown'. * @param string $type * Update type: 'download', 'localfile'. * * @return sting * HTML output. */ function theme_l10n_update_version_status($status, $type = NULL) { $msg = $icon = ''; $output = '
'; switch ($status) { case 'ok': $icon = theme('image', 'misc/watchdog-ok.png', t('ok'), t('ok')); $msg = ''. t('Up to date') .''; break; case 'update': $icon = theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')); $txt = ($type == 'download') ? t('Remote update available') : t('Local update available'); $msg = ''. $txt .''; break; case 'unknown': $icon = theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')); $msg = ''. t('No information') .''; break; } $output .= $msg; $output .= ''. $icon .''; $output .= "
"; return $output; }