/** * Attempts to find the locale settings based on the HTTP_ACCEPT_LANGUAGE variable * * @return bool Success */ protected function _autoLanguage() { $_detectableLanguages = $this->_request->acceptLanguage(); foreach ($_detectableLanguages as $langKey) { if (isset($this->_l10nCatalog[$langKey])) { $this->_setLanguage($langKey); return true; } if (strpos($langKey, '-') !== false) { $langKey = substr($langKey, 0, 2); if (isset($this->_l10nCatalog[$langKey])) { $this->_setLanguage($langKey); return true; } } } return false; }
/** * Test accept language * * @return void */ public function testAcceptLanguage() { $request = new Request(); // Weird language $request->env('HTTP_ACCEPT_LANGUAGE', 'inexistent,en-ca'); $result = $request->acceptLanguage(); $this->assertEquals(['inexistent', 'en-ca'], $result, 'Languages do not match'); // No qualifier $request->env('HTTP_ACCEPT_LANGUAGE', 'es_mx,en_ca'); $result = $request->acceptLanguage(); $this->assertEquals(['es-mx', 'en-ca'], $result, 'Languages do not match'); // With qualifier $request->env('HTTP_ACCEPT_LANGUAGE', 'en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4'); $result = $request->acceptLanguage(); $this->assertEquals(['en-us', 'en', 'pt-br', 'pt'], $result, 'Languages do not match'); // With spaces $request->env('HTTP_ACCEPT_LANGUAGE', 'da, en-gb;q=0.8, en;q=0.7'); $result = $request->acceptLanguage(); $this->assertEquals(['da', 'en-gb', 'en'], $result, 'Languages do not match'); // Checking if requested $request->env('HTTP_ACCEPT_LANGUAGE', 'es_mx,en_ca'); $result = $request->acceptLanguage(); $result = $request->acceptLanguage('en-ca'); $this->assertTrue($result); $result = $request->acceptLanguage('en-CA'); $this->assertTrue($result); $result = $request->acceptLanguage('en-us'); $this->assertFalse($result); $result = $request->acceptLanguage('en-US'); $this->assertFalse($result); }
/** * Get languages accepted by browser and return the one matching one of * those in config var `I18n.languages`. * * You should set config var `I18n.languages` to an array containing * languages available in your app. * * @param \Psr\Http\Message\ServerRequestInterface $request The request. * @param string|null $default Default language to return if no match is found. * * @return string */ public function detectLanguage(ServerRequestInterface $request, $default = null) { if (empty($default)) { $lang = $this->_config['defaultLanguage']; } else { $lang = $default; } $cakeRequest = new Request(); $browserLangs = $cakeRequest->acceptLanguage(); foreach ($browserLangs as $k => $langKey) { if (strpos($langKey, '-') !== false) { $browserLangs[$k] = substr($langKey, 0, 2); } } $acceptedLangs = array_intersect($browserLangs, array_keys($this->_config['languages'])); if (!empty($acceptedLangs)) { $lang = reset($acceptedLangs); } return $lang; }