From 05b76fefb290b442847ed2ac3e9eb61869392419 Mon Sep 17 00:00:00 2001 From: Flat Date: Mon, 23 Nov 2015 18:40:36 +0900 Subject: [PATCH 1/3] Split duplicated functions into web/inc/i18n.php --- web/inc/i18n.php | 47 +++++++++++++++++++++++++++++++++++++++++++ web/inc/main.php | 50 ++-------------------------------------------- web/js/i18n.js.php | 42 +++----------------------------------- 3 files changed, 52 insertions(+), 87 deletions(-) create mode 100644 web/inc/i18n.php diff --git a/web/inc/i18n.php b/web/inc/i18n.php new file mode 100644 index 00000000..5e4f71c1 --- /dev/null +++ b/web/inc/i18n.php @@ -0,0 +1,47 @@ +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); +} diff --git a/web/inc/main.php b/web/inc/main.php index 68fbe272..91e380ff 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 d84c9580..c3429d40 100644 --- a/web/js/i18n.js.php +++ b/web/js/i18n.js.php @@ -1,47 +1,11 @@ 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); - } -} ?> App.i18n.ARE_YOU_SURE = ''; From 2bd84f00f933e3701ccb94700e1b268451bcb649 Mon Sep 17 00:00:00 2001 From: Flat Date: Mon, 23 Nov 2015 19:46:38 +0900 Subject: [PATCH 2/3] Detect user language --- web/inc/i18n.php | 65 ++++++++++++++++++++++++++++++ web/js/i18n.js.php | 2 +- web/login/index.php | 4 +- web/reset/index.php | 10 +---- web/templates/admin/edit_user.html | 2 +- web/templates/user/edit_user.html | 2 +- 6 files changed, 72 insertions(+), 13 deletions(-) diff --git a/web/inc/i18n.php b/web/inc/i18n.php index 5e4f71c1..5971dc3d 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 c3429d40..34f52f18 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 06617e2f..f084ae17 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 f84fb38d..abde3c14 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 894a8a2c..8717ce3f 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 d42998a4..66600bd9 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"; From e3c1b17e3194063e7a36d5a1ce319da1979ce80a Mon Sep 17 00:00:00 2001 From: Flat Date: Mon, 23 Nov 2015 19:55:16 +0900 Subject: [PATCH 3/3] Fix minor typo. --- web/edit/user/index.php | 2 +- web/inc/i18n.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/edit/user/index.php b/web/edit/user/index.php index 5d04769f..c0ea9cd5 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 index 5971dc3d..1dab4cae 100644 --- a/web/inc/i18n.php +++ b/web/inc/i18n.php @@ -85,7 +85,7 @@ function detect_user_language($fallback='en') { } arsort($accept_langs_sorted); - // List lanugages + // List languages exec (VESTA_CMD."v-list-sys-languages json", $output, $return_var); $languages = json_decode(implode('', $output), true); unset($output);