diff --git a/web/inc/i18n.php b/web/inc/i18n.php index 5e4f71c19..5971dc3d8 100644 --- a/web/inc/i18n.php +++ b/web/inc/i18n.php @@ -45,3 +45,68 @@ function __() { array_unshift($args,$_SESSION['language']); return call_user_func_array("_translate",$args); } + +/** + * Detects user language from Accept-Language HTTP header. + * @param string Fallback language (default: 'en') + * @return string Language code (such as 'en' and 'ja') + */ +function detect_user_language($fallback='en') { + static $user_lang = ''; + + // Already detected + if (!empty($user_lang)) return $user_lang; + + // Check if Accept-Language header is available + if (!isset($_SERVER) || + !isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) || + !is_string($_SERVER['HTTP_ACCEPT_LANGUAGE']) + ) { + // Store result for reusing + $user_lang = $fallback; + return $user_lang; + } + + // Sort Accept-Language by `q` value + $accept_langs = explode(',', preg_replace('/\s/', '', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))); + $accept_langs_sorted = []; + foreach ($accept_langs as $lang) { + $div = explode(';q=', $lang, 2); + if (count($div) < 2) { + // `q` value was not specfied + // -> Set default `q` value (1) + $div[] = '1'; + } + list($code, $q) = $div; + if (preg_match('/^[\w\-]+$/', $code)) { + // Acceptable language code + $accept_langs_sorted[$code] = (double)$q; + } + } + arsort($accept_langs_sorted); + + // List lanugages + exec (VESTA_CMD."v-list-sys-languages json", $output, $return_var); + $languages = json_decode(implode('', $output), true); + unset($output); + + // Find best matching language + foreach ($accept_langs_sorted as $user_lang => $dummy) { + $decision = ''; + foreach ($languages as $prov_lang) { + if (strlen($decision) > strlen($prov_lang)) continue; + if (strpos($user_lang, $prov_lang) !== false) { + $decision = $prov_lang; + } + } + if (!empty($decision)) { + // Store result for reusing + $user_lang = $decision; + return $user_lang; + } + } + + // Store result for reusing + $user_lang = $fallback; + return $user_lang; +} \ No newline at end of file diff --git a/web/js/i18n.js.php b/web/js/i18n.js.php index c3429d402..34f52f188 100644 --- a/web/js/i18n.js.php +++ b/web/js/i18n.js.php @@ -4,7 +4,7 @@ session_start(); require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n.php'); if (empty($_SESSION['language'])) { - $_SESSION['language'] = 'en'; + $_SESSION['language'] = detect_user_language(); } ?> diff --git a/web/login/index.php b/web/login/index.php index 06617e2f4..f084ae174 100644 --- a/web/login/index.php +++ b/web/login/index.php @@ -93,8 +93,8 @@ foreach ($sys_arr as $key => $value) { $_SESSION[$key] = $value; } -// Set default language -if (empty($_SESSION['language'])) $_SESSION['language']='en'; +// Detect language +if (empty($_SESSION['language'])) $_SESSION['language'] = detect_user_language(); require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$_SESSION['language'].'.php'); require_once('../templates/header.html'); diff --git a/web/reset/index.php b/web/reset/index.php index f84fb38da..abde3c145 100644 --- a/web/reset/index.php +++ b/web/reset/index.php @@ -74,14 +74,8 @@ if ((!empty($_POST['user'])) && (!empty($_POST['code'])) && (!empty($_POST['pass } } -// Set system language -exec (VESTA_CMD . "v-list-sys-config json", $output, $return_var); -$data = json_decode(implode('', $output), true); -if (!empty( $data['config']['LANGUAGE'])) { - $_SESSION['language'] = $data['config']['LANGUAGE']; -} else { - $_SESSION['language'] = 'en'; -} +// Detect language +if (empty($_SESSION['language'])) $_SESSION['language'] = detect_user_language(); if (empty($_GET['action'])) { require_once '../templates/header.html'; diff --git a/web/templates/admin/edit_user.html b/web/templates/admin/edit_user.html index 894a8a2cc..8717ce3f6 100644 --- a/web/templates/admin/edit_user.html +++ b/web/templates/admin/edit_user.html @@ -125,7 +125,7 @@ if (( $value == $v_language ) || ( $svalue == $v_language)){ echo 'selected' ; } - if (( $value == 'en' ) && (empty($v_language))){ + if (( $value == detect_user_language() ) && (empty($v_language))){ echo 'selected' ; } echo ">".htmlentities($value)."\n"; diff --git a/web/templates/user/edit_user.html b/web/templates/user/edit_user.html index d42998a41..66600bd95 100644 --- a/web/templates/user/edit_user.html +++ b/web/templates/user/edit_user.html @@ -104,7 +104,7 @@ if (( $value == $v_language ) || ( $svalue == $v_language)){ echo 'selected' ; } - if (( $value == 'en' ) && (empty($v_language))){ + if (( $value == detect_user_language() ) && (empty($v_language))){ echo 'selected' ; } echo ">".htmlentities($value)."\n";