Add browser language auto-detection - refs #6224

1.9.x
Yannick Warnier 12 years ago
parent b499b305dc
commit 53764f5f6e
  1. 51
      main/admin/sub_language.class.php
  2. 13
      main/inc/global.inc.php

@ -312,7 +312,7 @@ class SubLanguageManager {
/**
* Set platform language
* @param Integer The language id
* @return void()
* @return bool
*/
public static function set_platform_language($language_id) {
if (empty($language_id) or (intval($language_id) != $language_id)) {
@ -350,7 +350,6 @@ class SubLanguageManager {
* @param string Children language path
* @return string Parent language path or null
*/
public static function get_parent_language_path($language_path) {
$tbl_admin_languages = Database :: get_main_table(TABLE_MAIN_LANGUAGE);
$tbl_settings_current = Database :: get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
@ -363,4 +362,52 @@ class SubLanguageManager {
return $row['dokeos_folder'];
}
/**
* Get language matching isocode
* @param string $isocode The language isocode (en, es, fr, zh-TW, etc)
* @return mixed English name of the matching language, or false if no active language could be found
*/
public static function getLanguageFromIsocode($isocode) {
$isocode = Database::escape_string($isocode);
$adminLanguagesTable = Database :: get_main_table(TABLE_MAIN_LANGUAGE);
// select language - if case several languages match, get the last (more recent) one
$sql = "SELECT english_name
FROM " . $adminLanguagesTable . "
WHERE isocode ='$isocode'
AND available = 1
ORDER BY id
DESC LIMIT 1";
$res = Database::query($sql);
if (Database::num_rows($res) < 1) {
return false;
}
$row = Database::fetch_assoc($res);
return $row['english_name'];
}
/**
* Get best language in browser preferences
* @param string $preferences The browser-configured language preferences (e.g. "en,es;q=0.7;en-us;q=0.3", etc)
* @return mixed English name of the matching language, or false if no active language could be found
*/
public static function getLanguageFromBrowserPreference($preferences) {
if (empty($preferences)) {
return false;
}
$preferencesArray = explode(',', $preferences);
if (count($preferencesArray) > 0) {
foreach ($preferencesArray as $pref) {
$s = strpos($pref, ';');
if ($s >= 2) {
$code = substr($pref, 0, $s);
} else {
$code = $pref;
}
$name = self::getLanguageFromIsocode($code);
if ($name !== false) {
return $name;
}
}
}
return false;
}
}

@ -373,6 +373,7 @@ if (api_get_setting('server_type') == 'test') {
// if we use the javascript version (without go button) we receive a get
// if we use the non-javascript version (with the go button) we receive a post
$user_language = '';
$browser_language = '';
if (!empty($_GET['language'])) {
$user_language = $_GET['language'];
}
@ -381,6 +382,14 @@ if (!empty($_POST['language_list'])) {
$user_language = str_replace('index.php?language=', '', $_POST['language_list']);
}
if (empty($user_language) && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
require_once __DIR__.'/../admin/sub_language.class.php';
$l = subLanguageManager::getLanguageFromBrowserPreference($_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (!empty($l)) {
$user_language = $browser_language = $l;
}
}
// Include all files (first english and then current interface language)
$langpath = api_get_path(SYS_LANG_PATH);
@ -458,8 +467,8 @@ if (!empty($valid_languages)) {
$language_priority3 = api_get_setting('languagePriority3');
$language_priority4 = api_get_setting('languagePriority4');
if (in_array($user_language, $valid_languages['folder']) && (isset($_GET['language']) || isset($_POST['language_list']))) {
$user_selected_language = $user_language; // $_GET['language'];
if (in_array($user_language, $valid_languages['folder']) && (isset($_GET['language']) || isset($_POST['language_list']) || !empty($browser_language))) {
$user_selected_language = $user_language; // $_GET['language']; or HTTP_ACCEPT_LANGUAGE
$_SESSION['user_language_choice'] = $user_selected_language;
$platformLanguage = $user_selected_language;
}

Loading…
Cancel
Save