diff --git a/l10n_update.admin.inc b/l10n_update.admin.inc index 688a0c9..8399943 100644 --- a/l10n_update.admin.inc +++ b/l10n_update.admin.inc @@ -451,7 +451,85 @@ function theme_l10n_update_edit_form_strings(array $variables) { } /** - * Prepares variables for translation status information templates. + * Returns HTML for the language overview form. + * + * @param array $variables + * An associative array containing: + * - form: A render element representing the form. + * @return mixed + * + * @ingroup themeable + */ +function theme_l10n_update_languages_overview_form($variables) { + $form = $variables['form']; + $default = language_default(); + $l10n_update_langcodes = variable_get('l10n_update_langcodes', array()); + $rows = array(); + + foreach ($form['name'] as $key => $element) { + // Do not take form control structures. + if (is_array($element) && element_child($key)) { + // Disable checkbox for the default language, because it cannot be disabled. + if ($key == $default->language) { + $form['enabled'][$key]['#attributes']['disabled'] = 'disabled'; + } + + // Add invisible labels for the checkboxes and radio buttons in the table + // for accessibility. These changes are only required and valid when the + // form is themed as a table, so it would be wrong to perform them in the + // form constructor. + $title = drupal_render($form['name'][$key]); + $form['enabled'][$key]['#title'] = t('Enable !title', array('!title' => $title)); + $form['enabled'][$key]['#title_display'] = 'invisible'; + $form['site_default'][$key]['#title'] = t('Set !title as default', array('!title' => $title)); + $form['site_default'][$key]['#title_display'] = 'invisible'; + $rows[] = array( + 'data' => array( + '' . $title . '', + drupal_render($form['native'][$key]), + check_plain($key), + !empty($l10n_update_langcodes[$key]) ? check_plain($l10n_update_langcodes[$key]) : check_plain($key), + drupal_render($form['direction'][$key]), + array('data' => drupal_render($form['enabled'][$key]), 'align' => 'center'), + drupal_render($form['site_default'][$key]), + drupal_render($form['weight'][$key]), + l( + t('edit'), + 'admin/config/regional/language/edit/' . $key + ) . (($key != 'en' && $key != $default->language) ? ' ' . l( + t('delete'), + 'admin/config/regional/language/delete/' . $key + ) : ''), + ), + 'class' => array('draggable'), + ); + } + } + + $header = array( + array('data' => t('English name')), + array('data' => t('Native name')), + array('data' => t('Code')), + array('data' => t('l10n code')), + array('data' => t('Direction')), + array('data' => t('Enabled')), + array('data' => t('Default')), + array('data' => t('Weight')), + array('data' => t('Operations')), + ); + $output = theme( + 'table', + array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'language-order')) + ); + $output .= '' . t('* l10n code is used to build file path to update translations.') . ''; + $output .= drupal_render_children($form); + + drupal_add_tabledrag('language-order', 'order', 'sibling', 'language-order-weight'); + + return $output; +} + +/** * Prepares variables for translation status information templates. * * Translation status information is displayed per language. * diff --git a/l10n_update.install b/l10n_update.install index 1d779ec..39f29d9 100644 --- a/l10n_update.install +++ b/l10n_update.install @@ -183,6 +183,7 @@ function l10n_update_uninstall() { variable_del('l10n_update_last_check'); variable_del('l10n_update_download_store'); variable_del('l10n_update_check_mode'); + variable_del('l10n_update_langcodes'); } /** diff --git a/l10n_update.module b/l10n_update.module index e9a2899..0f06be8 100644 --- a/l10n_update.module +++ b/l10n_update.module @@ -171,6 +171,10 @@ function l10n_update_theme() { 'file' => 'l10n_update.admin.inc', 'template' => 'l10n_update-translation-update-info', ), + 'l10n_update_languages_overview_form' => array( + 'render element' => 'form', + 'file' => 'l10n_update.admin.inc', + ), ); } /** @@ -297,15 +301,70 @@ function l10n_update_form_alter(&$form, $form_state, $form_id) { break; case 'locale_languages_predefined_form': + $form['#submit'][] = 'l10n_update_languages_changed_submit'; + break; + case 'locale_languages_custom_form': + l10n_update_language_destination_form($form, $form_state); $form['#submit'][] = 'l10n_update_languages_changed_submit'; break; + case 'locale_languages_edit_form': + l10n_update_language_destination_form($form, $form_state); + break; + case 'locale_languages_delete_form': // A language is being deleted. $form['#submit'][] = 'l10n_update_languages_delete_submit'; break; + + case 'locale_languages_overview_form': + $form['#theme'] = 'l10n_update_languages_overview_form'; + break; + } +} + +/** + * Add field to specify remote language code. + */ +function l10n_update_language_destination_form(&$form, $form_state) { + // Put action button in last position. + $form['custom language']['actions']['#weight'] = 10; + + if (!empty($form_state['build_info']['args'][0])) { + $langcode = $form_state['build_info']['args'][0]; + $l10n_update_langcodes = variable_get('l10n_update_langcodes', array()); + $l10n_langcode = !empty($l10n_update_langcodes[$langcode]) ? $l10n_update_langcodes[$langcode] : ''; + } + + // l10n language code field. + $form['custom language']['l10n_langcode'] = array( + '#type' => 'textfield', + '#title' => t('l10n language code'), + '#maxlength' => 12, + '#default_value' => isset($l10n_langcode) ? $l10n_langcode : '', + '#description' => t( + 'Used by "l10n_update" module to retrieve files from Drupal servers. '. + 'If missing, the language code will be used.' + ), + ); + + $form['#submit'][] = 'l10n_update_language_destination_form_submit'; +} + +/** + * Save destination language code. + */ +function l10n_update_language_destination_form_submit(&$form, $form_state) { + $l10n_update_langcodes = variable_get('l10n_update_langcodes', array()); + $langcode = $form_state['values']['langcode']; + if (!empty($form_state['values']['l10n_langcode'])) { + $l10n_update_langcodes[$langcode] = $form_state['values']['l10n_langcode']; + } + else { + unset($l10n_update_langcodes[$langcode]); } + variable_set('l10n_update_langcodes', $l10n_update_langcodes); } /** diff --git a/l10n_update.translation.inc b/l10n_update.translation.inc index 4612ec5..5b8e422 100644 --- a/l10n_update.translation.inc +++ b/l10n_update.translation.inc @@ -226,10 +226,15 @@ function l10n_update_source_check_file($source) { * - "keep": TRUE to keep the downloaded file. */ function l10n_update_source_build($project, $langcode, $filename = NULL) { + // Remote mapping codes. + $l10n_update_langcodes = variable_get('l10n_update_langcodes', array()); + $l10n_langcode = !empty($l10n_update_langcodes[$langcode]) ? check_plain($l10n_update_langcodes[$langcode]) : $langcode; + // Create a source object with data of the project object. $source = clone $project; $source->project = $project->name; $source->langcode = $langcode; + $source->l10n_langcode = $l10n_langcode; $source->type = ''; $source->timestamp = 0; $source->last_checked = 0; @@ -306,11 +311,18 @@ function l10n_update_source_build($project, $langcode, $filename = NULL) { * String with replaced placeholders. */ function l10n_update_build_server_pattern($project, $template) { + if (!empty($project->l10n_langcode)) { + $langcode = $project->l10n_langcode; + } + elseif (isset($project->langcode)) { + $langcode = $project->langcode; + } + $variables = array( '%project' => $project->name, '%release' => $project->version, '%core' => $project->core, - '%language' => isset($project->langcode) ? $project->langcode : '%language', + '%language' => isset($langcode) ? $langcode : '%language', ); return strtr($template, $variables); }