@@ -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+ }
0 commit comments