Skip to content

Commit 2bd84f0

Browse files
committed
Detect user language
1 parent 05b76fe commit 2bd84f0

File tree

6 files changed

+72
-13
lines changed

6 files changed

+72
-13
lines changed

web/inc/i18n.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,68 @@ function __() {
4545
array_unshift($args,$_SESSION['language']);
4646
return call_user_func_array("_translate",$args);
4747
}
48+
49+
/**
50+
* Detects user language from Accept-Language HTTP header.
51+
* @param string Fallback language (default: 'en')
52+
* @return string Language code (such as 'en' and 'ja')
53+
*/
54+
function detect_user_language($fallback='en') {
55+
static $user_lang = '';
56+
57+
// Already detected
58+
if (!empty($user_lang)) return $user_lang;
59+
60+
// Check if Accept-Language header is available
61+
if (!isset($_SERVER) ||
62+
!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ||
63+
!is_string($_SERVER['HTTP_ACCEPT_LANGUAGE'])
64+
) {
65+
// Store result for reusing
66+
$user_lang = $fallback;
67+
return $user_lang;
68+
}
69+
70+
// Sort Accept-Language by `q` value
71+
$accept_langs = explode(',', preg_replace('/\s/', '', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])));
72+
$accept_langs_sorted = [];
73+
foreach ($accept_langs as $lang) {
74+
$div = explode(';q=', $lang, 2);
75+
if (count($div) < 2) {
76+
// `q` value was not specfied
77+
// -> Set default `q` value (1)
78+
$div[] = '1';
79+
}
80+
list($code, $q) = $div;
81+
if (preg_match('/^[\w\-]+$/', $code)) {
82+
// Acceptable language code
83+
$accept_langs_sorted[$code] = (double)$q;
84+
}
85+
}
86+
arsort($accept_langs_sorted);
87+
88+
// List lanugages
89+
exec (VESTA_CMD."v-list-sys-languages json", $output, $return_var);
90+
$languages = json_decode(implode('', $output), true);
91+
unset($output);
92+
93+
// Find best matching language
94+
foreach ($accept_langs_sorted as $user_lang => $dummy) {
95+
$decision = '';
96+
foreach ($languages as $prov_lang) {
97+
if (strlen($decision) > strlen($prov_lang)) continue;
98+
if (strpos($user_lang, $prov_lang) !== false) {
99+
$decision = $prov_lang;
100+
}
101+
}
102+
if (!empty($decision)) {
103+
// Store result for reusing
104+
$user_lang = $decision;
105+
return $user_lang;
106+
}
107+
}
108+
109+
// Store result for reusing
110+
$user_lang = $fallback;
111+
return $user_lang;
112+
}

web/js/i18n.js.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n.php');
55

66
if (empty($_SESSION['language'])) {
7-
$_SESSION['language'] = 'en';
7+
$_SESSION['language'] = detect_user_language();
88
}
99
?>
1010

web/login/index.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@
9393
$_SESSION[$key] = $value;
9494
}
9595

96-
// Set default language
97-
if (empty($_SESSION['language'])) $_SESSION['language']='en';
96+
// Detect language
97+
if (empty($_SESSION['language'])) $_SESSION['language'] = detect_user_language();
9898

9999
require_once($_SERVER['DOCUMENT_ROOT'].'/inc/i18n/'.$_SESSION['language'].'.php');
100100
require_once('../templates/header.html');

web/reset/index.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,8 @@
7474
}
7575
}
7676

77-
// Set system language
78-
exec (VESTA_CMD . "v-list-sys-config json", $output, $return_var);
79-
$data = json_decode(implode('', $output), true);
80-
if (!empty( $data['config']['LANGUAGE'])) {
81-
$_SESSION['language'] = $data['config']['LANGUAGE'];
82-
} else {
83-
$_SESSION['language'] = 'en';
84-
}
77+
// Detect language
78+
if (empty($_SESSION['language'])) $_SESSION['language'] = detect_user_language();
8579

8680
if (empty($_GET['action'])) {
8781
require_once '../templates/header.html';

web/templates/admin/edit_user.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@
125125
if (( $value == $v_language ) || ( $svalue == $v_language)){
126126
echo 'selected' ;
127127
}
128-
if (( $value == 'en' ) && (empty($v_language))){
128+
if (( $value == detect_user_language() ) && (empty($v_language))){
129129
echo 'selected' ;
130130
}
131131
echo ">".htmlentities($value)."</option>\n";

web/templates/user/edit_user.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
if (( $value == $v_language ) || ( $svalue == $v_language)){
105105
echo 'selected' ;
106106
}
107-
if (( $value == 'en' ) && (empty($v_language))){
107+
if (( $value == detect_user_language() ) && (empty($v_language))){
108108
echo 'selected' ;
109109
}
110110
echo ">".htmlentities($value)."</option>\n";

0 commit comments

Comments
 (0)