diff --git a/agents/toplevel/HtmlAgent.inc b/agents/toplevel/HtmlAgent.inc index 4af26dbc..34abd31d 100644 --- a/agents/toplevel/HtmlAgent.inc +++ b/agents/toplevel/HtmlAgent.inc @@ -53,33 +53,104 @@ // Add Seminary sidebar $this->addSubAgent('Seminarybar'); } - - - - - /** - * Set requested language. - * - * @param \nre\core\Request $request Current request - */ - private function setLanguage(\nre\core\Request $request) - { - // Set domain - $domain = \nre\configs\AppConfig::$app['genericname']; - - // Get language - $locale = $request->getGetParam('lang', 'language'); - if(is_null($locale)) { - return; - } - - // Load translation - putenv("LC_ALL=$locale"); - setlocale(LC_ALL, $locale); - bindtextdomain($domain, ROOT.DS.\nre\configs\AppConfig::$dirs['locale']); - textdomain($domain); - } - - } + + + + + /** + * Set requested language. + * + * @param \nre\core\Request $request Current request + */ + private function setLanguage(\nre\core\Request $request) + { + // Set domain + $domain = \nre\configs\AppConfig::$app['genericname']; + + // Get language + $locale = $this->determineLanguage($request); + + // Set Locale and Load translation + if(!is_null($locale)) + { + //$locale = sprintf('%s_%s.UTF-8', $locale, strtoupper($locale)); + putenv("LC_ALL=$locale"); + setlocale(LC_ALL, $locale); + \Locale::setDefault($locale); + + bindtextdomain($domain, ROOT.DS.\nre\configs\AppConfig::$dirs['locale']); + textdomain($domain); + } + } + + + /** + * Determine which language is either requested directly or by browser + * setting. + * + * @param \nre\core\Request $request Current request + * @return string Requested language or default one + */ + private function determineLanguage(\nre\core\Request $request) + { + // Get supported languages + $supportedLanguages = \nre\configs\AppConfig::$app['languages']; + if(empty($supportedLanguages)) { + return null; + } + + // Get requested language + $language = $request->getGetParam('lang', 'language'); + if(!is_null($language) && array_key_exists($language, $supportedLanguages)) { + return $language; + } + + // Negotiate language + return $this->negotiateLanguage($supportedLanguages, $request->getBrowserLanguages()); + } + + + /** + * Negotiate which language the browser wants most out of the supported + * languages. + * + * @param array $supportedLanguages List of supported languages + * @param array $browserLanguages List of browser languages + * @return string Negotiated language or default one + */ + private function negotiateLanguage($supportedLanguages, $browserLanguages) + { + if(!is_null($browserLanguages)) + { + // Create array with languages and their ratings + $parsedLanguages = array(); + $languages = explode(',', $browserLanguages); + foreach($languages as &$language) + { + if(($pos = strpos($language, ';q=')) !== false) { + $parsedLanguages[substr($language, 1, min(2, $pos-1))] = floatval(substr($language, $pos+3)); + } + else { + $parsedLanguages[$language] = 1.0; + } + } + + // Sort languages by their ratings + arsort($parsedLanguages); + + // Get highest supported language + foreach($parsedLanguages as $language => $rating) { + if(array_key_exists($language, $supportedLanguages)) { + return $supportedLanguages[$language]; + } + } + } + + + // Return default language + return $supportedLanguages[array_keys($supportedLanguages)[0]]; + } + + } ?> diff --git a/app/Controller.inc b/app/Controller.inc index cdd7e7d4..3603db23 100644 --- a/app/Controller.inc +++ b/app/Controller.inc @@ -83,19 +83,22 @@ // Create date and time and number formatter $this->set('dateFormatter', new \IntlDateFormatter( - \nre\core\Config::getDefault('locale'), + //\nre\core\Config::getDefault('locale'), + \Locale::getDefault(), \IntlDateFormatter::MEDIUM, \IntlDateFormatter::NONE, NULL )); $this->set('timeFormatter', new \IntlDateFormatter( - \nre\core\Config::getDefault('locale'), + //\nre\core\Config::getDefault('locale'), + \Locale::getDefault(), \IntlDateFormatter::NONE, \IntlDateFormatter::SHORT, NULL )); $this->set('numberFormatter', new \NumberFormatter( - \nre\core\Config::getDefault('locale'), + //\nre\core\Config::getDefault('locale'), + \Locale::getDefault(), \NumberFormatter::DEFAULT_STYLE )); } diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index d895b5c7..9c992234 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -36,7 +36,10 @@ 'timeZone' => 'Europe/Berlin', 'mailsender' => '', 'mailcontact' => '', - 'registration_host' => '' + 'registration_host' => '', + 'languages' => array( + 'de' => 'de_DE.utf8' + ) ); @@ -53,9 +56,7 @@ 'toplevel-htmlmail' => 'htmlmail', 'intermediate' => 'introduction', 'intermediate-error' => 'error', - 'intermediate-mail' => 'mail', - 'language' => 'de_DE.utf8', - 'locale' => 'de-DE' + 'intermediate-mail' => 'mail' ); diff --git a/requests/WebRequest.inc b/requests/WebRequest.inc index 2e0f19b9..a02dba93 100644 --- a/requests/WebRequest.inc +++ b/requests/WebRequest.inc @@ -184,6 +184,22 @@ { return $_SERVER['REQUEST_METHOD']; } + + + /** + * Get languages from browser setting. + * + * @return string Browser setting for accepted languages. + */ + public function getBrowserLanguages() + { + if(array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER)) { + return $_SERVER['HTTP_ACCEPT_LANGUAGE']; + } + + + return null; + } /**