add support for multiple languages

This commit is contained in:
oliver 2015-04-26 11:15:38 +02:00
commit 980ed7d014
4 changed files with 126 additions and 35 deletions

View file

@ -53,33 +53,104 @@
// Add Seminary sidebar // Add Seminary sidebar
$this->addSubAgent('Seminarybar'); $this->addSubAgent('Seminarybar');
} }
/** /**
* Set requested language. * Set requested language.
* *
* @param \nre\core\Request $request Current request * @param \nre\core\Request $request Current request
*/ */
private function setLanguage(\nre\core\Request $request) private function setLanguage(\nre\core\Request $request)
{ {
// Set domain // Set domain
$domain = \nre\configs\AppConfig::$app['genericname']; $domain = \nre\configs\AppConfig::$app['genericname'];
// Get language // Get language
$locale = $request->getGetParam('lang', 'language'); $locale = $this->determineLanguage($request);
if(is_null($locale)) {
return; // Set Locale and Load translation
} if(!is_null($locale))
{
// Load translation //$locale = sprintf('%s_%s.UTF-8', $locale, strtoupper($locale));
putenv("LC_ALL=$locale"); putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale); setlocale(LC_ALL, $locale);
bindtextdomain($domain, ROOT.DS.\nre\configs\AppConfig::$dirs['locale']); \Locale::setDefault($locale);
textdomain($domain);
} 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]];
}
}
?> ?>

View file

@ -83,19 +83,22 @@
// Create date and time and number formatter // Create date and time and number formatter
$this->set('dateFormatter', new \IntlDateFormatter( $this->set('dateFormatter', new \IntlDateFormatter(
\nre\core\Config::getDefault('locale'), //\nre\core\Config::getDefault('locale'),
\Locale::getDefault(),
\IntlDateFormatter::MEDIUM, \IntlDateFormatter::MEDIUM,
\IntlDateFormatter::NONE, \IntlDateFormatter::NONE,
NULL NULL
)); ));
$this->set('timeFormatter', new \IntlDateFormatter( $this->set('timeFormatter', new \IntlDateFormatter(
\nre\core\Config::getDefault('locale'), //\nre\core\Config::getDefault('locale'),
\Locale::getDefault(),
\IntlDateFormatter::NONE, \IntlDateFormatter::NONE,
\IntlDateFormatter::SHORT, \IntlDateFormatter::SHORT,
NULL NULL
)); ));
$this->set('numberFormatter', new \NumberFormatter( $this->set('numberFormatter', new \NumberFormatter(
\nre\core\Config::getDefault('locale'), //\nre\core\Config::getDefault('locale'),
\Locale::getDefault(),
\NumberFormatter::DEFAULT_STYLE \NumberFormatter::DEFAULT_STYLE
)); ));
} }

View file

@ -36,7 +36,10 @@
'timeZone' => 'Europe/Berlin', 'timeZone' => 'Europe/Berlin',
'mailsender' => '', 'mailsender' => '',
'mailcontact' => '', 'mailcontact' => '',
'registration_host' => '' 'registration_host' => '',
'languages' => array(
'de' => 'de_DE.utf8'
)
); );
@ -53,9 +56,7 @@
'toplevel-htmlmail' => 'htmlmail', 'toplevel-htmlmail' => 'htmlmail',
'intermediate' => 'introduction', 'intermediate' => 'introduction',
'intermediate-error' => 'error', 'intermediate-error' => 'error',
'intermediate-mail' => 'mail', 'intermediate-mail' => 'mail'
'language' => 'de_DE.utf8',
'locale' => 'de-DE'
); );

View file

@ -184,6 +184,22 @@
{ {
return $_SERVER['REQUEST_METHOD']; 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;
}
/** /**