You are here

public function ConfigurableLanguageManager::getFallbackCandidates in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/language/src/ConfigurableLanguageManager.php \Drupal\language\ConfigurableLanguageManager::getFallbackCandidates()

Returns the language fallback candidates for a given context.

Parameters

array $context: (optional) An associative array of data that can be useful to determine the fallback sequence. The following keys are used in core:

  • langcode: Language code of the desired language.
  • operation: The name of the operation indicating the context where language fallback is being applied. The following operations are defined in core, but more may be defined in contributed modules:

    • entity_view: Invoked when an entity is about to be displayed. The data key contains the loaded entity.
    • views_query: Invoked when a field based views query is performed. The data key contains a reference to the field object.
    • locale_lookup: Invoked when a string translation was not found. The data key contains the source string.
  • data: A data structure that makes sense in the provided context, see above.

Return value

array An array of language codes sorted by priority: first values should be tried first.

Overrides LanguageManager::getFallbackCandidates

File

core/modules/language/src/ConfigurableLanguageManager.php, line 366

Class

ConfigurableLanguageManager
Overrides default LanguageManager to provide configured languages.

Namespace

Drupal\language

Code

public function getFallbackCandidates(array $context = []) {
  if ($this
    ->isMultilingual()) {
    $candidates = [];
    if (empty($context['operation']) || $context['operation'] != 'locale_lookup') {

      // If the fallback context is not locale_lookup, initialize the
      // candidates with languages ordered by weight and add
      // LanguageInterface::LANGCODE_NOT_SPECIFIED at the end. Interface
      // translation fallback should only be based on explicit configuration
      // gathered via the alter hooks below.
      $candidates = array_keys($this
        ->getLanguages());
      $candidates[] = LanguageInterface::LANGCODE_NOT_SPECIFIED;
      $candidates = array_combine($candidates, $candidates);

      // The first candidate should always be the desired language if
      // specified.
      if (!empty($context['langcode'])) {
        $candidates = [
          $context['langcode'] => $context['langcode'],
        ] + $candidates;
      }
    }

    // Let other modules hook in and add/change candidates.
    $type = 'language_fallback_candidates';
    $types = [];
    if (!empty($context['operation'])) {
      $types[] = $type . '_' . $context['operation'];
    }
    $types[] = $type;
    $this->moduleHandler
      ->alter($types, $candidates, $context);
  }
  else {
    $candidates = parent::getFallbackCandidates($context);
  }
  return $candidates;
}