Translations overview page callback.
\Drupal\Core\Entity\EntityInterface $entity: The entity whose translation overview should be displayed.
function translation_entity_overview(EntityInterface $entity) {
$controller = translation_entity_controller($entity
->entityType());
$languages = language_list();
$original = $entity
->language()->langcode;
$translations = $entity
->getTranslationLanguages();
$field_ui = module_exists('field_ui');
$path = $controller
->getViewPath($entity);
$base_path = $controller
->getBasePath($entity);
$edit_path = $controller
->getEditPath($entity);
$header = array(
t('Language'),
t('Translation'),
t('Source language'),
t('Status'),
t('Operations'),
);
$rows = array();
if (language_multilingual()) {
// If we have a view path defined for the current entity get the switch
// links based on it.
if ($path) {
$links = _translation_entity_get_switch_links($path);
}
// Determine whether the current entity is translatable.
$translatable = FALSE;
foreach (field_info_instances($entity
->entityType(), $entity
->bundle()) as $instance) {
$field_name = $instance['field_name'];
$field = field_info_field($field_name);
if ($field['translatable']) {
$translatable = TRUE;
break;
}
}
foreach ($languages as $language) {
$language_name = $language->name;
$langcode = $language->langcode;
$add_path = $base_path . '/translations/add/' . $original . '/' . $langcode;
$delete_path = $base_path . '/translations/delete/' . $langcode;
if ($base_path) {
$add_links = _translation_entity_get_switch_links($add_path);
$edit_links = _translation_entity_get_switch_links($edit_path);
$delete_links = _translation_entity_get_switch_links($delete_path);
}
$operations = array(
'data' => array(
'#type' => 'operations',
'#links' => array(),
),
);
$links =& $operations['data']['#links'];
if (isset($translations[$langcode])) {
// Existing translation in the translation set: display status.
$source = isset($entity->source[$langcode]) ? $entity->source[$langcode] : '';
$is_original = $langcode == $original;
$translation = $translations[$langcode];
$label = $entity
->label($langcode);
$link = isset($links->links[$langcode]['href']) ? $links->links[$langcode] : array(
'href' => $path,
'language' => $language,
);
$row_title = l($label, $link['href'], $link);
if (empty($link['href'])) {
$row_title = $is_original ? $label : t('n/a');
}
if ($edit_path && $controller
->getAccess($entity, 'update') && $controller
->getTranslationAccess($entity, $langcode)) {
$links['edit'] = isset($edit_links->links[$langcode]['href']) ? $edit_links->links[$langcode] : array(
'href' => $edit_path,
'language' => $language,
);
$links['edit']['title'] = t('edit');
}
// @todo Consider supporting the ability to track translation publishing
// status independently from entity status, as it may not exist.
$translation = $entity
->getTranslation($langcode, FALSE);
$status = !isset($translation->status) || $translation->status ? t('Published') : t('Not published');
// @todo Add a theming function here.
$status = '<span class="status">' . $status . '</span>' . (!empty($entity->retranslate[$langcode]) ? ' <span class="marker">' . t('outdated') . '</span>' : '');
if ($is_original) {
$language_name = t('<strong>@language_name</strong>', array(
'@language_name' => $language_name,
));
$source_name = t('n/a');
}
else {
$source_name = isset($languages[$source]) ? $languages[$source]->name : t('n/a');
$links['delete'] = isset($delete_links->links[$langcode]['href']) ? $delete_links->links[$langcode] : array(
'href' => $delete_links,
'language' => $language,
);
$links['delete']['title'] = t('delete');
}
}
else {
// No such translation in the set yet: help user to create it.
$row_title = $source_name = t('n/a');
$source = $entity
->language()->langcode;
if ($source != $langcode && $controller
->getAccess($entity, 'update')) {
if ($translatable) {
$links['add'] = isset($add_links->links[$langcode]['href']) ? $add_links->links[$langcode] : array(
'href' => $add_path,
'language' => $language,
);
$links['add']['title'] = t('add');
}
elseif ($field_ui) {
$entity_path = field_ui_bundle_admin_path($entity
->entityType(), $entity
->bundle());
// Link directly to the fields tab to make it easier to find the
// setting to enable translation on fields.
$path = $entity_path . '/fields';
$links['nofields'] = array(
'title' => t('no translatable fields'),
'href' => $path,
'language' => $language,
);
}
}
$status = t('Not translated');
}
$rows[] = array(
$language_name,
$row_title,
$source_name,
$status,
$operations,
);
}
}
drupal_set_title(t('Translations of %label', array(
'%label' => $entity
->label(),
)), PASS_THROUGH);
// Add metadata to the build render array to let other modules know about
// which entity this is.
$build['#entity'] = $entity;
$build['translation_entity_overview'] = array(
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
);
return $build;
}