Page callback: Display the current translation status.
function locale_translation_status_form($form, &$form_state) {
module_load_include('translation.inc', 'locale');
module_load_include('compare.inc', 'locale');
$updates = $options = array();
$languages_update = $languages_not_found = array();
// @todo Calling locale_translation_build_projects() is an expensive way to
// get a module name. In follow-up issue http://drupal.org/node/1842362
// the project name will be stored to display use, like here.
$project_data = locale_translation_build_projects();
$languages = locale_translatable_language_list();
$projects = locale_translation_get_projects();
$status = Drupal::state()
->get('locale.translation_status');
// Prepare information about projects which have available translation
// updates.
if ($languages && $status) {
foreach ($status as $project_id => $project) {
foreach ($project as $langcode => $project_info) {
// No translation file found for this project-language combination.
if (!isset($project_info->type)) {
$updates[$langcode]['not_found'][] = array(
'name' => $project_info->name == 'drupal' ? t('Drupal core') : $project_data[$project_info->name]->info['name'],
'version' => $project_info->version,
'info' => _locale_translation_status_debug_info($project_info),
);
$languages_not_found[$langcode] = $langcode;
}
elseif ($project_info->type == LOCALE_TRANSLATION_LOCAL || $project_info->type == LOCALE_TRANSLATION_REMOTE) {
$local = isset($project_info->files[LOCALE_TRANSLATION_LOCAL]) ? $project_info->files[LOCALE_TRANSLATION_LOCAL] : NULL;
$remote = isset($project_info->files[LOCALE_TRANSLATION_REMOTE]) ? $project_info->files[LOCALE_TRANSLATION_REMOTE] : NULL;
$recent = _locale_translation_source_compare($local, $remote) == LOCALE_TRANSLATION_SOURCE_COMPARE_LT ? $remote : $local;
$updates[$langcode]['updates'][] = array(
'name' => $project_data[$project_info->name]->info['name'],
'version' => $project_info->version,
'timestamp' => $recent->timestamp,
);
$languages_update[$langcode] = $langcode;
}
}
}
$languages_not_found = array_diff($languages_not_found, $languages_update);
// Build data options for the select table.
foreach ($updates as $langcode => $update) {
$options[$langcode] = array(
'title' => check_plain($languages[$langcode]->name),
'status' => array(
'class' => array(
'description',
'expand',
'priority-low',
),
'data' => theme('locale_translation_update_info', $update),
),
);
}
// Sort the table data on language name.
uasort($options, 'drupal_sort_title');
}
$last_checked = Drupal::state()
->get('locale.translation_last_checked');
$form['last_checked'] = array(
'#markup' => '<p>' . theme('locale_translation_last_check', array(
'last' => $last_checked,
)) . '</p>',
);
$header = array(
'title' => array(
'data' => t('Language'),
'class' => array(
'title',
),
),
'status' => array(
'data' => t('Status'),
'class' => array(
'status',
'priority-low',
),
),
);
if (!$languages) {
$empty = t('No translatable languages available. <a href="@add_language">Add a language</a> first.', array(
'@add_language' => url('admin/config/regional/language'),
));
}
elseif ($status) {
$empty = t('All translations up to date.');
}
else {
$empty = t('No translation status available. <a href="@check">Check manually</a>.', array(
'@check' => url('admin/reports/translations/check'),
));
}
$form['langcodes'] = array(
'#type' => 'tableselect',
'#header' => $header,
'#options' => $options,
'#default_value' => $languages_update,
'#empty' => $empty,
'#js_select' => TRUE,
'#multiple' => TRUE,
'#required' => TRUE,
'#not_found' => $languages_not_found,
'#after_build' => array(
'locale_translation_language_table',
),
);
$form['#attached']['library'][] = array(
'locale',
'drupal.locale.admin',
);
$form['#attached']['css'] = array(
drupal_get_path('module', 'locale') . '/css/locale.admin.css',
);
$form['actions'] = array(
'#type' => 'actions',
);
if ($languages_update) {
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Update translations'),
);
}
return $form;
}