function LanguageNegotiationUrl::processOutbound

Same name and namespace in other branches
  1. 9 core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl::processOutbound()
  2. 8.9.x core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl::processOutbound()
  3. 10 core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl::processOutbound()

Overrides OutboundPathProcessorInterface::processOutbound

File

core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php, line 126

Class

LanguageNegotiationUrl
Class for identifying language via URL prefix or domain.

Namespace

Drupal\language\Plugin\LanguageNegotiation

Code

public function processOutbound($path, &$options = [], ?Request $request = NULL, ?BubbleableMetadata $bubbleable_metadata = NULL) {
    $url_scheme = 'http';
    $port = 80;
    if ($request) {
        $url_scheme = $request->getScheme();
        $port = $request->getPort();
    }
    $languages = array_flip(array_keys($this->languageManager
        ->getLanguages()));
    // Language can be passed as an option, or we go for current URL language.
    if (!isset($options['language']) || $options['language'] instanceof LanguageInterface && $options['language']->getId() == LanguageInterface::LANGCODE_NOT_SPECIFIED) {
        $language_url = $this->languageManager
            ->getCurrentLanguage(LanguageInterface::TYPE_URL);
        $options['language'] = $language_url;
    }
    elseif (!is_object($options['language']) || !isset($languages[$options['language']->getId()])) {
        return $path;
    }
    $config = $this->config
        ->get('language.negotiation')
        ->get('url');
    if ($config['source'] == LanguageNegotiationUrl::CONFIG_PATH_PREFIX) {
        if (is_object($options['language']) && !empty($config['prefixes'][$options['language']->getId()])) {
            $options['prefix'] = $config['prefixes'][$options['language']->getId()] . '/';
            if ($bubbleable_metadata) {
                $bubbleable_metadata->addCacheContexts([
                    'languages:' . LanguageInterface::TYPE_URL,
                ]);
            }
        }
    }
    elseif ($config['source'] == LanguageNegotiationUrl::CONFIG_DOMAIN) {
        if (is_object($options['language']) && !empty($config['domains'][$options['language']->getId()])) {
            // Save the original base URL. If it contains a port, we need to
            // retain it below.
            if (!empty($options['base_url'])) {
                // The colon in the URL scheme messes up the port checking below.
                $normalized_base_url = str_replace([
                    'https://',
                    'http://',
                ], '', $options['base_url']);
            }
            // Ask for an absolute URL with our modified base URL.
            $options['absolute'] = TRUE;
            $options['base_url'] = $url_scheme . '://' . $config['domains'][$options['language']->getId()];
            // In case either the original base URL or the HTTP host contains a
            // port, retain it.
            if (isset($normalized_base_url) && str_contains($normalized_base_url, ':')) {
                [
                    ,
                    $port,
                ] = explode(':', $normalized_base_url);
                $options['base_url'] .= ':' . $port;
            }
            elseif ($url_scheme == 'http' && $port != 80 || $url_scheme == 'https' && $port != 443) {
                $options['base_url'] .= ':' . $port;
            }
            if (isset($options['https'])) {
                if ($options['https'] === TRUE) {
                    $options['base_url'] = str_replace('http://', 'https://', $options['base_url']);
                }
                elseif ($options['https'] === FALSE) {
                    $options['base_url'] = str_replace('https://', 'http://', $options['base_url']);
                }
            }
            // Add Drupal's subfolder from the base_path if there is one.
            $options['base_url'] .= rtrim(base_path(), '/');
            if ($bubbleable_metadata) {
                $bubbleable_metadata->addCacheContexts([
                    'languages:' . LanguageInterface::TYPE_URL,
                    'url.site',
                ]);
            }
        }
    }
    return $path;
}

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