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;
+ }
/**