LanguageBrowserDetectionAcceptLanguageTest.php

Same filename in other branches
  1. 9 core/modules/language/tests/src/Functional/LanguageBrowserDetectionAcceptLanguageTest.php
  2. 8.9.x core/modules/language/tests/src/Functional/LanguageBrowserDetectionAcceptLanguageTest.php
  3. 10 core/modules/language/tests/src/Functional/LanguageBrowserDetectionAcceptLanguageTest.php

Namespace

Drupal\Tests\language\Functional

File

core/modules/language/tests/src/Functional/LanguageBrowserDetectionAcceptLanguageTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\language\Functional;

use Drupal\Tests\BrowserTestBase;
use Drupal\language\Entity\ConfigurableLanguage;

/**
 * Tests browser language detection with different accept-language headers.
 *
 * @group language
 */
class LanguageBrowserDetectionAcceptLanguageTest extends BrowserTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'language',
        'locale',
        'content_translation',
        'system_test',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected $defaultTheme = 'stark';
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        // User to manage languages.
        $admin = $this->drupalCreateUser([], NULL, TRUE);
        $this->drupalLogin($admin);
        // Create FR.
        ConfigurableLanguage::createFromLangcode('fr')->save();
        // Set language detection to URL and browser detection.
        $this->drupalGet('/admin/config/regional/language/detection');
        $this->submitForm([
            'language_interface[enabled][language-url]' => TRUE,
            'language_interface[enabled][language-browser]' => TRUE,
            'language_interface[enabled][language-selected]' => TRUE,
        ], 'Save settings');
        // Set prefixes to en and fr.
        $this->drupalGet('/admin/config/regional/language/detection/url');
        $this->submitForm([
            'prefix[en]' => 'en',
            'prefix[fr]' => 'fr',
        ], 'Save configuration');
        // Add language codes to browser detection.
        $this->drupalGet('/admin/config/regional/language/detection/browser');
        $this->submitForm([
            'new_mapping[browser_langcode]' => 'fr',
            'new_mapping[drupal_langcode]' => 'fr',
        ], 'Save configuration');
        $this->drupalGet('/admin/config/regional/language/detection/browser');
        $this->submitForm([
            'new_mapping[browser_langcode]' => 'en',
            'new_mapping[drupal_langcode]' => 'en',
        ], 'Save configuration');
        $this->drupalGet('/admin/config/regional/language/detection/selected');
        $this->submitForm([
            'edit-selected-langcode' => 'en',
        ], 'Save configuration');
        $this->drupalLogout();
    }
    
    /**
     * Tests with browsers with and without Accept-Language header.
     */
    public function testAcceptLanguageEmptyDefault() : void {
        // Check correct headers.
        $this->drupalGet('/en/system-test/echo/language test', [], [
            'Accept-Language' => 'en',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'en');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
        $this->drupalGet('/fr/system-test/echo/language test', [], [
            'Accept-Language' => 'en',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'fr');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'MISS');
        $this->drupalGet('/system-test/echo/language test', [], [
            'Accept-Language' => 'en',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'en');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'UNCACHEABLE (response policy)');
        // Check with UK browser.
        $this->drupalGet('/system-test/echo/language test', [], [
            'Accept-Language' => 'en-UK,en',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'en');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'UNCACHEABLE (response policy)');
        // Check with french browser.
        $this->drupalGet('/system-test/echo/language test', [], [
            'Accept-Language' => 'fr-FR,fr',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'fr');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'UNCACHEABLE (response policy)');
        // Check with browser without language settings - should return fallback language.
        $this->drupalGet('/system-test/echo/language test', [], [
            'Accept-Language' => '',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'en');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'UNCACHEABLE (response policy)');
        // Check with french browser again.
        $this->drupalGet('/system-test/echo/language test', [], [
            'Accept-Language' => 'fr-FR,fr',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'fr');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'UNCACHEABLE (response policy)');
        // Check with UK browser.
        $this->drupalGet('/system-test/echo/language test', [], [
            'Accept-Language' => 'en-UK,en',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'en');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'UNCACHEABLE (response policy)');
        // Check if prefixed URLs are still cached.
        $this->drupalGet('/en/system-test/echo/language test', [], [
            'Accept-Language' => 'en',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'en');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
        $this->drupalGet('/fr/system-test/echo/language test', [], [
            'Accept-Language' => 'en',
        ]);
        $this->assertSession()
            ->responseHeaderEquals('Content-Language', 'fr');
        $this->assertSession()
            ->responseHeaderEquals('X-Drupal-Cache', 'HIT');
    }

}

Classes

Title Deprecated Summary
LanguageBrowserDetectionAcceptLanguageTest Tests browser language detection with different accept-language headers.

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