diff --git a/web/edit/user/index.php b/web/edit/user/index.php index 5d04769fe..c0ea9cd5c 100644 --- a/web/edit/user/index.php +++ b/web/edit/user/index.php @@ -62,7 +62,7 @@ exec (VESTA_CMD."v-list-user-packages json", $output, $return_var); $packages = json_decode(implode('', $output), true); unset($output); -// List lanugages +// List languages exec (VESTA_CMD."v-list-sys-languages json", $output, $return_var); $languages = json_decode(implode('', $output), true); unset($output); diff --git a/web/inc/i18n.php b/web/inc/i18n.php new file mode 100644 index 000000000..1dab4cae4 --- /dev/null +++ b/web/inc/i18n.php @@ -0,0 +1,112 @@ +1) { + $args[0] = $text; + return call_user_func_array("sprintf",$args); + } else { + return $text; + } +} + +/** + * Translates string by a given key in first parameter to current session language. Works like sprintf + * @global array $LANG Associative array of language pharses + * @return string Translated string + * @see _translate() + */ +function __() { + $args = func_get_args(); + 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 languages + 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/inc/main.php b/web/inc/main.php index 68fbe272a..91e380ff2 100644 --- a/web/inc/main.php +++ b/web/inc/main.php @@ -1,6 +1,8 @@ 1) { - $args[0] = $text; - return call_user_func_array("sprintf",$args); - } else { - return $text; - } -} - define('VESTA_CMD', '/usr/bin/sudo /usr/local/vesta/bin/'); $i = 0; diff --git a/web/js/i18n.js.php b/web/js/i18n.js.php index d84c95801..34f52f188 100644 --- a/web/js/i18n.js.php +++ b/web/js/i18n.js.php @@ -1,46 +1,10 @@ 1) { - $args[0] = $text; - return call_user_func_array("sprintf",$args); - } else { - return $text; - } - } -} - -if (!function_exists('__')) { - function __() { - $args = func_get_args(); - array_unshift($args,$_SESSION['language']); - return call_user_func_array("_translate",$args); - } + $_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";