You are here

function entity_translation_hierarchy_get_candidate in Language Hierarchy 7

Returns langcode of entity translation candidate.

Parameters

object $entity:

string $entity_type:

string $langcode:

bool $include_current:

Return value

string|null

5 calls to entity_translation_hierarchy_get_candidate()
entity_translation_hierarchy_field_attach_view_alter in modules/entity_translation_hierarchy/entity_translation_hierarchy.module
Implements hook_field_attach_view_alter().
entity_translation_hierarchy_init in modules/entity_translation_hierarchy/entity_translation_hierarchy.node.inc
Implements hook_init().
entity_translation_hierarchy_is_blocked in modules/entity_translation_hierarchy/entity_translation_hierarchy.module
Checks if for given language the entity is blocked.
hreflang_hierarchy_get_links in modules/hreflang_hierarchy/hreflang_hierarchy.module
Gets hreflang links for given path.
xmlsitemap_language_hierarchy_create_link in modules/xmlsitemap_language_hierarchy/xmlsitemap_language_hierarchy.module
Create a sitemap link from a node.

File

modules/entity_translation_hierarchy/entity_translation_hierarchy.module, line 227

Code

function entity_translation_hierarchy_get_candidate($entity, $entity_type, $langcode, $include_current = TRUE) {
  if ($handler = entity_translation_get_handler($entity_type, $entity, TRUE)) {
    if ($translations = $handler
      ->getTranslations()) {

      // Make a copy of this so we can operate on translation data without affecting the original.
      $translation_candidates = $translations->data;

      // Filter out unpublished or inaccessible translations.
      // We treat them as non existing - they can't block nor be displayed at all.
      // Inheritance process flows through them, so to speak...
      foreach ($translations->data as $translation_langcode => $translation) {
        if (!entity_translation_access($entity_type, $translation)) {
          unset($translation_candidates[$translation_langcode]);
        }
      }

      // Remove current candidate.
      if (!$include_current && isset($translation_candidates[$langcode])) {
        unset($translation_candidates[$langcode]);
      }
      $fallback_candidates = array_keys(language_hierarchy_get_ancestors($langcode));
      array_unshift($fallback_candidates, $langcode);

      // Return the closest candidate with existing translation.
      $translation_candidate_langcodes = array_keys($translation_candidates);
      return current(array_intersect($fallback_candidates, $translation_candidate_langcodes));
    }
  }
  return NULL;
}