add support for multiple languages
This commit is contained in:
parent
f5a8e51cbd
commit
980ed7d014
4 changed files with 126 additions and 35 deletions
|
|
@ -57,29 +57,100 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load translation
|
// Set Locale and Load translation
|
||||||
putenv("LC_ALL=$locale");
|
if(!is_null($locale))
|
||||||
setlocale(LC_ALL, $locale);
|
{
|
||||||
bindtextdomain($domain, ROOT.DS.\nre\configs\AppConfig::$dirs['locale']);
|
//$locale = sprintf('%s_%s.UTF-8', $locale, strtoupper($locale));
|
||||||
textdomain($domain);
|
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]];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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'
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,22 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a URL-route.
|
* Add a URL-route.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue