add support for multiple languages
This commit is contained in:
parent
db3bee1aab
commit
3fdb23374c
4 changed files with 126 additions and 35 deletions
|
|
@ -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]];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue