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

include/functions.php (3 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();
0 ignored issues
show
Are you sure the assignment to $config is correct as $xlanguageHandler->loadFileConfig() (which targets XlanguageLanguageHandler::loadFileConfig()) seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
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))
112
            //            || ($envType == 2 && eregi('(\(|\[|;[[:space:]])(' . $expr . ')(;|\]|\))', $str))) {
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')
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'];
133
    }
134
135
    if (!empty($_SERVER['HTTP_USER_AGENT'])) {
136
        $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
137
    }
138
139
    $lang       = '';
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)) {
144
    //        $accepted    = explode(',', $HTTP_ACCEPT_LANGUAGE);
145
    //        $acceptedCnt = count($accepted);
146
    //        reset($accepted);
147
    //        for ($i = 0; $i < $acceptedCnt; ++$i) {
148
    //            $lang = xlanguage_lang_detect($accepted[$i], 1);
149
    //            if (strncasecmp($lang, 'en', 2)) {
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
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) {
0 ignored issues
show
The expression $block['languages'] of type string is not traversable.
Loading history...
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);
0 ignored issues
show
The variable $lang does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
357
        $lang = $tmp[0];
358
    }
359
360
    return $lang;
361
}
362