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);
}