- $add_url = new Url(
- "entity.$entity_type_id.content_translation_add",
- [
- 'source' => $original,
- 'target' => $language->getId(),
- $entity_type_id => $entity->id(),
- ],
- [
- 'language' => $language,
- ]
- );
- $edit_url = new Url(
- "entity.$entity_type_id.content_translation_edit",
- [
- 'language' => $language->getId(),
- $entity_type_id => $entity->id(),
- ],
- [
- 'language' => $language,
- ]
- );
- $delete_url = new Url(
- "entity.$entity_type_id.content_translation_delete",
- [
- 'language' => $language->getId(),
- $entity_type_id => $entity->id(),
- ],
- [
- 'language' => $language,
- ]
- );
+ // If the entity type is revisionable, we may have pending revisions
+ // with translations not available yet in the default revision. Thus we
+ // need to load the latest translation-affecting revision for each
+ // language to be sure we are listing all available translations.
+ if ($use_latest_revisions) {
+ $entity = $default_revision;
+ $latest_revision_id = $storage->getLatestTranslationAffectedRevisionId($entity->id(), $langcode);
+ if ($latest_revision_id) {
+ /** @var \Drupal\Core\Entity\ContentEntityInterface $latest_revision */
+ $latest_revision = $storage->loadRevision($latest_revision_id);
+ // Make sure we do not list removed translations, i.e. translations
+ // that have been part of a default revision but no longer are.
+ if (!$latest_revision->wasDefaultRevision() || $default_revision->hasTranslation($langcode)) {
+ $entity = $latest_revision;
+ }
+ }
+ $translations = $entity->getTranslationLanguages();
+ }
+
+ $options = ['language' => $language];
+ $add_url = $entity->toUrl('drupal:content-translation-add', $options)
+ ->setRouteParameter('source', $original)
+ ->setRouteParameter('target', $language->getId());
+ $edit_url = $entity->toUrl('drupal:content-translation-edit', $options)
+ ->setRouteParameter('language', $language->getId());
+ $delete_url = $entity->toUrl('drupal:content-translation-delete', $options)
+ ->setRouteParameter('language', $language->getId());