function ConfigurableLanguageManager::getLanguageSwitchLinks

Same name and namespace in other branches
  1. 10 core/modules/language/src/ConfigurableLanguageManager.php \Drupal\language\ConfigurableLanguageManager::getLanguageSwitchLinks()
  2. 11.x core/modules/language/src/ConfigurableLanguageManager.php \Drupal\language\ConfigurableLanguageManager::getLanguageSwitchLinks()
  3. 9 core/modules/language/src/ConfigurableLanguageManager.php \Drupal\language\ConfigurableLanguageManager::getLanguageSwitchLinks()
  4. 8.9.x core/modules/language/src/ConfigurableLanguageManager.php \Drupal\language\ConfigurableLanguageManager::getLanguageSwitchLinks()

Overrides LanguageManager::getLanguageSwitchLinks

File

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

Class

ConfigurableLanguageManager
Overrides default LanguageManager to provide configured languages.

Namespace

Drupal\language

Code

public function getLanguageSwitchLinks($type, Url $url) {
  if ($this->negotiator) {
    foreach ($this->negotiator
      ->getNegotiationMethods($type) as $method_id => $method) {
      if (is_subclass_of($method['class'], LanguageSwitcherInterface::class)) {
        $original_languages = $this->negotiatedLanguages;
        $result = $this->negotiator
          ->getNegotiationMethodInstance($method_id)
          ->getLanguageSwitchLinks($this->requestStack
          ->getCurrentRequest(), $type, $url);
        if (!empty($result)) {
          // Allow modules to provide translations for specific links.
          $this->moduleHandler
            ->alter('language_switch_links', $result, $type, $url);
          $result = array_filter($result, function (array $link) : bool {
            $url = $link['url'] ?? NULL;
            $language = $link['language'] ?? NULL;
            if ($language instanceof LanguageInterface) {
              $this->negotiatedLanguages[LanguageInterface::TYPE_CONTENT] = $language;
              $this->negotiatedLanguages[LanguageInterface::TYPE_INTERFACE] = $language;
            }
            $check_access_fn = function () use ($url) {
              try {
                return $url instanceof Url && $url->access();
              } catch (\Exception) {
                return FALSE;
              }
            };
            // If this method is running in a Fiber, contain the URL access
            // checks to within child fibers. This is to prevent the
            // negotiated languages changes from escaping to other fibers
            // where rendering or other processes could run in the context of
            // the wrong languages.
            if (\Fiber::getCurrent()) {
              $fiber = new \Fiber($check_access_fn);
              $fiber->start();
              while (!$fiber->isTerminated()) {
                if ($fiber->isSuspended()) {
                  $resume_type = $fiber->resume();
                  if (!$fiber->isTerminated() && $resume_type !== FiberResumeType::Immediate) {
                    usleep(500);
                  }
                }
              }
              return $fiber->getReturn();
            }
            // If not running in a fiber, check URL access as usual.
            return $check_access_fn();
          });
          $this->negotiatedLanguages = $original_languages;
          $links = (object) [
            'links' => $result,
            'method_id' => $method_id,
          ];
          break;

        }
      }
    }
  }
  return $links ?? NULL;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.