Completed
Push — master ( 98eeb4...22887c )
by Michael
11s
created

include/functions.php (13 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * xLanguage module (eXtensible Language Management For XOOPS)
4
 *
5
 * You may not change or alter any portion of this comment or credits
6
 * of supporting developers from this source code or any supporting source code
7
 * which is considered copyrighted (c) material of the original comment or credit authors.
8
 * This program is distributed in the hope that it will be useful,
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * @copyright    XOOPS Project (https://xoops.org)
13
 * @license      {@link http://www.gnu.org/licenses/gpl-2.0.html GNU Public License}
14
 * @package      xlanguage
15
 * @since        2.0
16
 * @author       D.J.(phppp) [email protected]
17
 * @param $value
18
 * @param $out_charset
19
 * @param $in_charset
20
 * @return array|string
21
 */
22
23
function xlanguage_convert_encoding($value, $out_charset, $in_charset)
24
{
25
    if (is_array($value)) {
26
        foreach ($value as $key => $val) {
27
            $value[$key] = xlanguage_convert_encoding($val, $out_charset, $in_charset);
28
        }
29
    } else {
30
        $value = xlanguage_convert_item($value, $out_charset, $in_charset);
31
    }
32
33
    return $value;
34
}
35
36
/**
37
 * @param $value
38
 * @param $out_charset
39
 * @param $in_charset
40
 * @return string
41
 */
42
function xlanguage_convert_item($value, $out_charset, $in_charset)
43
{
44
    if (strtolower($in_charset) == strtolower($out_charset)) {
45
        return $value;
46
    }
47
    $xconvHandler = @xoops_getModuleHandler('xconv', 'xconv', true);
48
    if (is_object($xconvHandler) && $converted_value = @$xconvHandler->convert_encoding($value, $out_charset, $in_charset)) {
49
        return $converted_value;
50
    }
51
    if (XOOPS_USE_MULTIBYTES && function_exists('mb_convert_encoding')) {
52
        $converted_value = @mb_convert_encoding($value, $out_charset, $in_charset);
53
    } elseif (function_exists('iconv')) {
54
        $converted_value = @iconv($in_charset, $out_charset, $value);
55
    }
56
    $value = empty($converted_value) ? $value : $converted_value;
57
58
    return $value;
59
}
60
61
/**
62
 * @return mixed
63
 */
64
function xlanguage_createConfig()
65
{
66
    /** @var \XlanguageLanguageHandler $xlanguageHandler */
67
    $xlanguageHandler = xoops_getModuleHandler('language', 'xlanguage');
68
69
    return $xlanguageHandler->createConfig();
70
}
71
72
/**
73
 * @return mixed
74
 */
75
function xlanguage_loadConfig()
76
{
77
    /** @var \XlanguageLanguageHandler $xlanguageHandler */
78
    $xlanguageHandler = xoops_getModuleHandler('language', 'xlanguage');
79
    $config       = $xlanguageHandler->loadFileConfig();
80
81
    return $config;
82
}
83
84
/**
85
 * Analyzes some PHP environment variables to find the most probable language
86
 * that should be used
87
 *
88
 * @param  string $str
89
 * @param  string $envType
90
 * @return int|string
91
 * @internal param $string $ string to analyze
92
 * @internal param $integer $ type of the PHP environment variable which value is $str
93
 *
94
 * @global        array    the list of available translations
95
 * @global        string   the retained translation keyword
96
 * @access   private
97
 */
98
function xlanguage_lang_detect($str = '', $envType = '')
99
{
100
    global $available_languages;
101
    $lang = '';
102
103
    if (!empty($available_languages)) {
104
        foreach ($available_languages as $key => $value) {
105
            // $envType =  1 for the 'HTTP_ACCEPT_LANGUAGE' environment variable,
106
            //             2 for the 'HTTP_USER_AGENT' one
107
            $expr = $value[0];
108
            if (strpos($expr, '[-_]') === false) {
109
                $expr = str_replace('|', '([-_][[:alpha:]]{2,3})?|', $expr);
110
            }
111
            //        if (($envType == 1 && eregi('^(' . $expr . ')(;q=[0-9]\\.[0-9])?$', $str))
0 ignored issues
show
Unused Code Comprehensibility introduced by
49% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
112
            //            || ($envType == 2 && eregi('(\(|\[|;[[:space:]])(' . $expr . ')(;|\]|\))', $str))) {
0 ignored issues
show
Unused Code Comprehensibility introduced by
49% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
113
            if (($envType == 1 && preg_match('#^(' . $expr . ')(;q=[0-9]\\.[0-9])?$#i', $str)) || ($envType == 2 && preg_match('#(\(|\[|;[[:space:]])(' . $expr . ')(;|\]|\))#i', $str))) {
114
                $lang = $key;
115
                //if($lang != 'en')
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
116
                break;
117
            }
118
        }
119
    }
120
121
    return $lang;
122
}
123
124
/**
125
 * @return string
126
 */
127
function xlanguage_detectLang()
128
{
129
    global $available_languages, $_SERVER;
130
131
    if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
132
        $HTTP_ACCEPT_LANGUAGE = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
0 ignored issues
show
$HTTP_ACCEPT_LANGUAGE is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
133
    }
134
135
    if (!empty($_SERVER['HTTP_USER_AGENT'])) {
136
        $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
137
    }
138
139
    $lang       = '';
0 ignored issues
show
$lang is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
140
    $xoops_lang = '';
141
    // 1. try to findout user's language by checking its HTTP_ACCEPT_LANGUAGE variable
142
143
    //    if (empty($lang) && !empty($HTTP_ACCEPT_LANGUAGE)) {
0 ignored issues
show
Unused Code Comprehensibility introduced by
74% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
144
    //        $accepted    = explode(',', $HTTP_ACCEPT_LANGUAGE);
0 ignored issues
show
Unused Code Comprehensibility introduced by
54% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
145
    //        $acceptedCnt = count($accepted);
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
146
    //        reset($accepted);
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
147
    //        for ($i = 0; $i < $acceptedCnt; ++$i) {
0 ignored issues
show
Unused Code Comprehensibility introduced by
53% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
148
    //            $lang = xlanguage_lang_detect($accepted[$i], 1);
0 ignored issues
show
Unused Code Comprehensibility introduced by
63% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
149
    //            if (strncasecmp($lang, 'en', 2)) {
0 ignored issues
show
Unused Code Comprehensibility introduced by
65% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
150
    //                break;
151
    //            }
152
    //        }
153
    //    }
154
155
    //This returns the most preferred langauage "q=1"
156
    $lang = getPreferredLanguage();
157
158
    // 2. if not found in HTTP_ACCEPT_LANGUAGE, try to find user's language by checking its HTTP_USER_AGENT variable
159
    if (empty($lang) && !empty($HTTP_USER_AGENT)) {
160
        $lang = xlanguage_lang_detect($HTTP_USER_AGENT, 2);
161
    }
162
    // 3. If we catch a valid language, configure it
163
    if (!empty($lang)) {
164
        $xoops_lang = $available_languages[$lang][1];
165
    }
166
167
    return $xoops_lang;
168
}
169
170
/**
171
 * @param $output
172
 * @return array|mixed|string
173
 */
174
function xlanguage_encoding($output)
175
{
176
    global $xlanguage;
177
    $output = xlanguage_ml($output);
178
    // escape XML doc
179
    if (preg_match("/^\<\?[\s]?xml[\s]+version=([\"'])[^\>]+\\1[\s]+encoding=([\"'])[^\>]+\\2[\s]?\?\>/i", $output)) {
180
        return $output;
181
    }
182
    $in_charset  = $xlanguage['charset_base'];
183
    $out_charset = $xlanguage['charset'];
184
185
    $output = xlanguage_convert_encoding($output, $out_charset, $in_charset);
186
    return $output;
187
}
188
189
/**
190
 * @param $s
191
 * @return mixed
192
 */
193
function xlanguage_ml($s)
194
{
195
    global $xoopsConfig;
196
    global $xlanguage_langs;
197
    if (!isset($xlanguage_langs)) {
198
199
        /** @var \XlanguageLanguageHandler $xlanguageHandler */
200
        $xlanguageHandler = xoops_getModuleHandler('language', 'xlanguage');
201
        $langs            = $xlanguageHandler->getAll(true);
202
        //        $langs = $GLOBALS['xlanguageHandler']->getAll(true); //mb
0 ignored issues
show
Unused Code Comprehensibility introduced by
63% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
203
        foreach (array_keys($langs) as $_lang) {
204
            $xlanguage_langs[$_lang] = $langs[$_lang]->getVar('lang_code');
205
        }
206
        unset($langs);
207
    }
208
    if (empty($xlanguage_langs) || count($xlanguage_langs) == 0) {
209
        return $s;
210
    }
211
212
    // escape brackets inside of <code>...</code>
213
    $patterns[] = '/(\<code>.*\<\/code>)/isU';
214
215
    // escape brackets inside of <input type="..." value="...">
216
    $patterns[] = '/(\<input\b(?![^\>]*\btype=([\'"]?)(submit|image|reset|button))[^\>]*\>)/isU';
217
218
    // escape brackets inside of <textarea></textarea>
219
    $patterns[] = '/(\<textarea\b[^>]*>[^\<]*\<\/textarea>)/isU';
220
221
    $s = preg_replace_callback($patterns, 'xlanguage_ml_escape_bracket', $s);
222
223
    // create the pattern between language tags
224
    $pqhtmltags  = explode(',', preg_quote(XLANGUAGE_TAGS_RESERVED, '/'));
225
    $mid_pattern = '(?:(?!(' . implode('|', $pqhtmltags) . ')).)*';
226
227
    $patterns = array();
228
    $replaces = array();
229
    /* */
230
    if (isset($xlanguage_langs[$xoopsConfig['language']])) {
231
        $lang       = $xlanguage_langs[$xoopsConfig['language']];
232
        $patterns[] = '/(\[([^\]]*\|)?' . preg_quote($lang) . '(\|[^\]]*)?\])(' . $mid_pattern . ')(\[\/([^\]]*\|)?' . preg_quote($lang) . '(\|[^\]]*)?\])/isU';
233
        $replaces[] = '$4';
234
    }
235
    /* */
236
    foreach (array_keys($xlanguage_langs) as $_lang) {
237
        if ($_lang == @$xoopsConfig['language']) {
238
            continue;
239
        }
240
        $name       = $xlanguage_langs[$_lang];
241
        $patterns[] = '/(\[([^\]]*\|)?' . preg_quote($name) . '(\|[^\]]*)?\])(' . $mid_pattern . ')(\[\/([^\]]*\|)?' . preg_quote($name) . '(\|[^\]]*)?(\]\<br[\s]?[\/]?\>|\]))/isU';
242
        $replaces[] = '';
243
    }
244
    if (!empty($xoopsConfig['language'])) {
245
        $s = preg_replace('/\[[\/]?[\|]?' . preg_quote($xoopsConfig['language']) . '[\|]?\](\<br \/\>)?/i', '', $s);
246
    }
247
    if (count($replaces) > 0) {
248
        $s = preg_replace($patterns, $replaces, $s);
249
    }
250
251
    return $s;
252
}
253
254
/**
255
 * @param $matches
256
 * @return mixed
257
 */
258
function xlanguage_ml_escape_bracket($matches)
259
{
260
    global $xlanguage_langs;
261
    $ret = $matches[1];
262
    if (!empty($xlanguage_langs)) {
263
        $pattern = '/(\[([\/])?(' . implode('|', array_map('preg_quote', array_values($xlanguage_langs))) . ')([\|\]]))/isU';
264
        $ret     = preg_replace($pattern, "&#91;\\2\\3\\4", $ret);
265
    }
266
267
    return $ret;
268
}
269
270
/**
271
 * @param  null $options
272
 * @return bool
273
 */
274
function xlanguage_select_show($options = null)
275
{
276
    require_once XOOPS_ROOT_PATH . '/modules/xlanguage/blocks/xlanguage_blocks.php';
277
    if (empty($options)) {
278
        $options[0] = 'images'; // display style: image, text, select
279
        $options[1] = ' '; // delimitor
280
        $options[2] = 5; // items per line
281
    }
282
283
    $block        = b_xlanguage_select_show($options);
284
    $block['tag'] = 'xlanguage';
285
286
    $content = '';
287
    $i       = 1;
288
    if (!empty($block['display'])) { //mb
289
        if (in_array($block['display'], array('images', 'text'))) {
290
            foreach ($block['languages'] as $name => $lang) {
291
                $content .= '<a href="' . $block['url'] . $lang['name'] . '" title="' . $lang['desc'] . '">';
292
                if ($block['display'] === 'images') {
293
                    $content .= '<img src="' . $lang['image'] . '" alt="' . $lang['desc'] . '"';
294
                    if ($block['selected'] != $lang['name']) {
295
                        $content .= ' style="MozOpacity: .8; opacity: .8; filter:Alpha(opacity=80);"';
296
                    }
297
                    $content .= '>';
298
                } else {
299
                    $content .= $lang['desc'];
300
                }
301
                $content .= '</a>';
302
                if ((++$i % $block['number']) == 0) {
303
                    $content .= '<br>';
304
                }
305
            }
306
        } else {
307
            $content .= '<select name="' . $block['tag'] . '"
308
                onChange="if (this.options[this.selectedIndex].value.length >0) { window.document.location=this.options[this.selectedIndex].value;}"
309
                >';
310
            if (!empty($block['languages'])) { //mb
311
                foreach ($block['languages'] as $name => $lang) {
312
                    $content .= '<option value="' . $block['url'] . $lang['name'] . '"';
313
                    if ($block['selected'] == $lang['name']) {
314
                        $content .= ' selected ';
315
                    }
316
                    $content .= '>' . $lang['desc'] . '</option>';
317
                }
318
            }
319
            $content .= '</select>';
320
        }
321
    }
322
323
    define('XLANGUAGE_SWITCH_CODE', $content);
324
325
    return true;
326
}
327
328
/**
329
 * @return int|string
330
 */
331
function getPreferredLanguage()
332
{
333
    $langs = array();
334
    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
335
        // break up string into pieces (languages and q factors)
336
        preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.\d+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
337
        if (count($lang_parse[1])) {
338
            // create a list like "en" => 0.8
339
            $langs = array_combine($lang_parse[1], $lang_parse[4]);
340
            // set default to 1 for any without q factor
341
            foreach ($langs as $lang => $val) {
342
                if ($val === '') {
343
                    $langs[$lang] = 1;
344
                }
345
            }
346
            // sort list based on value
347
            arsort($langs, SORT_NUMERIC);
348
        }
349
    }
350
    //extract most important (first)
351
    foreach ($langs as $lang => $val) {
352
        break;
353
    }
354
    //if complex language simplify it
355
    if (strstr($lang, '-')) {
356
        $tmp  = explode('-', $lang);
357
        $lang = $tmp[0];
358
    }
359
360
    return $lang;
361
}
362