Chris@18
|
1 <?php
|
Chris@18
|
2
|
Chris@18
|
3 namespace Drupal\Tests\language\Functional;
|
Chris@18
|
4
|
Chris@18
|
5 use Drupal\Tests\BrowserTestBase;
|
Chris@18
|
6 use Drupal\language\Entity\ConfigurableLanguage;
|
Chris@18
|
7
|
Chris@18
|
8 /**
|
Chris@18
|
9 * Tests browser language detection with different accept-language headers.
|
Chris@18
|
10 *
|
Chris@18
|
11 * @group language
|
Chris@18
|
12 */
|
Chris@18
|
13 class LanguageBrowserDetectionAcceptLanguageTest extends BrowserTestBase {
|
Chris@18
|
14
|
Chris@18
|
15 /**
|
Chris@18
|
16 * Modules to enable.
|
Chris@18
|
17 *
|
Chris@18
|
18 * @var array
|
Chris@18
|
19 */
|
Chris@18
|
20 public static $modules = ['language', 'locale', 'content_translation', 'system_test'];
|
Chris@18
|
21
|
Chris@18
|
22 /**
|
Chris@18
|
23 * {@inheritdoc}
|
Chris@18
|
24 */
|
Chris@18
|
25 protected function setUp() {
|
Chris@18
|
26 parent::setUp();
|
Chris@18
|
27 // User to manage languages.
|
Chris@18
|
28 $admin = $this->drupalCreateUser([], NULL, TRUE);
|
Chris@18
|
29 $this->drupalLogin($admin);
|
Chris@18
|
30
|
Chris@18
|
31 // Create FR.
|
Chris@18
|
32 ConfigurableLanguage::createFromLangcode('fr')->save();
|
Chris@18
|
33 // Set language detection to url and browser detection.
|
Chris@18
|
34 $this->drupalPostForm('/admin/config/regional/language/detection', [
|
Chris@18
|
35 'language_interface[enabled][language-url]' => TRUE,
|
Chris@18
|
36 'language_interface[enabled][language-browser]' => TRUE,
|
Chris@18
|
37 'language_interface[enabled][language-selected]' => TRUE,
|
Chris@18
|
38 ], 'Save settings');
|
Chris@18
|
39
|
Chris@18
|
40 // Set prefixes to en and fr.
|
Chris@18
|
41 $this->drupalPostForm('/admin/config/regional/language/detection/url', [
|
Chris@18
|
42 'prefix[en]' => 'en',
|
Chris@18
|
43 'prefix[fr]' => 'fr',
|
Chris@18
|
44 ], 'Save configuration');
|
Chris@18
|
45 // Add language codes to browser detection.
|
Chris@18
|
46 $this->drupalPostForm('/admin/config/regional/language/detection/browser', [
|
Chris@18
|
47 'new_mapping[browser_langcode]' => 'fr',
|
Chris@18
|
48 'new_mapping[drupal_langcode]' => 'fr',
|
Chris@18
|
49 ], 'Save configuration');
|
Chris@18
|
50 $this->drupalPostForm('/admin/config/regional/language/detection/browser', [
|
Chris@18
|
51 'new_mapping[browser_langcode]' => 'en',
|
Chris@18
|
52 'new_mapping[drupal_langcode]' => 'en',
|
Chris@18
|
53 ], 'Save configuration');
|
Chris@18
|
54 $this->drupalPostForm('/admin/config/regional/language/detection/selected', [
|
Chris@18
|
55 'edit-selected-langcode' => 'en',
|
Chris@18
|
56 ], 'Save configuration');
|
Chris@18
|
57
|
Chris@18
|
58 $this->drupalLogout();
|
Chris@18
|
59 }
|
Chris@18
|
60
|
Chris@18
|
61 /**
|
Chris@18
|
62 * Tests with browsers with and without Accept-Language header.
|
Chris@18
|
63 */
|
Chris@18
|
64 public function testAcceptLanguageEmptyDefault() {
|
Chris@18
|
65
|
Chris@18
|
66 // Check correct headers.
|
Chris@18
|
67 $this->drupalGet('/en/system-test/echo/language test', [], ['Accept-Language' => 'en']);
|
Chris@18
|
68 $this->assertSession()->responseHeaderEquals('Content-Language', 'en');
|
Chris@18
|
69 $this->assertSession()->responseHeaderEquals('X-Drupal-Cache', 'MISS');
|
Chris@18
|
70
|
Chris@18
|
71 $this->drupalGet('/fr/system-test/echo/language test', [], ['Accept-Language' => 'en']);
|
Chris@18
|
72 $this->assertSession()->responseHeaderEquals('Content-Language', 'fr');
|
Chris@18
|
73 $this->assertSession()->responseHeaderEquals('X-Drupal-Cache', 'MISS');
|
Chris@18
|
74
|
Chris@18
|
75 $this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => 'en']);
|
Chris@18
|
76 $this->assertSession()->responseHeaderEquals('Content-Language', 'en');
|
Chris@18
|
77 $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'));
|
Chris@18
|
78
|
Chris@18
|
79 // Check with UK browser.
|
Chris@18
|
80 $this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => 'en-UK,en']);
|
Chris@18
|
81 $this->assertSession()->responseHeaderEquals('Content-Language', 'en');
|
Chris@18
|
82 $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'));
|
Chris@18
|
83
|
Chris@18
|
84 // Check with french browser.
|
Chris@18
|
85 $this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => 'fr-FR,fr']);
|
Chris@18
|
86 $this->assertSession()->responseHeaderEquals('Content-Language', 'fr');
|
Chris@18
|
87 $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'));
|
Chris@18
|
88
|
Chris@18
|
89 // Check with browser without language settings - should return fallback language.
|
Chris@18
|
90 $this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => NULL]);
|
Chris@18
|
91 $this->assertSession()->responseHeaderEquals('Content-Language', 'en');
|
Chris@18
|
92 $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'));
|
Chris@18
|
93
|
Chris@18
|
94 // Check with french browser again.
|
Chris@18
|
95 $this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => 'fr-FR,fr']);
|
Chris@18
|
96 $this->assertSession()->responseHeaderEquals('Content-Language', 'fr');
|
Chris@18
|
97 $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'));
|
Chris@18
|
98
|
Chris@18
|
99 // Check with UK browser.
|
Chris@18
|
100 $this->drupalGet('/system-test/echo/language test', [], ['Accept-Language' => 'en-UK,en']);
|
Chris@18
|
101 $this->assertSession()->responseHeaderEquals('Content-Language', 'en');
|
Chris@18
|
102 $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'));
|
Chris@18
|
103
|
Chris@18
|
104 // Check if prefixed URLs are still cached.
|
Chris@18
|
105 $this->drupalGet('/en/system-test/echo/language test', [], ['Accept-Language' => 'en']);
|
Chris@18
|
106 $this->assertSession()->responseHeaderEquals('Content-Language', 'en');
|
Chris@18
|
107 $this->assertSession()->responseHeaderEquals('X-Drupal-Cache', 'HIT');
|
Chris@18
|
108
|
Chris@18
|
109 $this->drupalGet('/fr/system-test/echo/language test', [], ['Accept-Language' => 'en']);
|
Chris@18
|
110 $this->assertSession()->responseHeaderEquals('Content-Language', 'fr');
|
Chris@18
|
111 $this->assertSession()->responseHeaderEquals('X-Drupal-Cache', 'HIT');
|
Chris@18
|
112 }
|
Chris@18
|
113
|
Chris@18
|
114 }
|