Completed
Push — master ( cc16f7...57d484 )
by Adam
05:48 queued 04:16
created

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
/* PROJECT:     ReactOS Translation Tool
3
 * LICENSE:     GPL
4
 * AUTHORS:     Adam Stachowicz <[email protected]>
5
 * AUTHOR URL:  http://it-maniak.pl/
6
 */
7
8
include_once 'header.php';
9
?>
10
11
<h1>Search missing translation strings</h1>
12
13
<div id="body">
14
<center>
15
    <form method="GET" class="form-horizontal">
16
        <fieldset>
17
            <legend>Please type your <a href="https://beta.wikiversity.org/wiki/List_of_ISO_639-1_codes">language code in ISO 639-1</a>. For example: pl for Polish, de for German</legend>
18
            <div class="form-group">
19
                <label class="col-md-4 control-label" for="lang">Language code:</label>
20
                <div class="col-md-4">
21
                    <input type="text" value="<?php echo isset($_SESSION['lang']) ? $_SESSION['lang'] : '' ?>" id="lang" name="lang" class="form-control input-md" required="required" autofocus="autofocus" pattern="[A-Za-z]{2}" title="Two letter language code"/>
22
                </div>
23
            </div>
24
            <div class="form-group">
25
                <label class="col-md-4 control-label" for="dir">Directories:</label>
26
                <div class="col-md-4">
27
                <select id="dir" name="dir" class="form-control">
28
                    <option value="1">base, boot</option>
29
                    <option value="2" <?php if (isset($_GET['dir']) && $_GET['dir'] == '2') {
30
    echo 'selected';
31
}?>>dll</option>
32
                    <option value="3" <?php if (isset($_GET['dir']) && $_GET['dir'] == '3') {
33
    echo 'selected';
34
}?>>media, subsystems, win32ss</option>
35
                    <option value="100" <?php if (isset($_GET['dir']) && $_GET['dir'] == '100') {
36
    echo 'selected';
37
}?>>All ReactOS Source dir</option>
38
                </select>
39
                </div>
40
            </div>
41
            <div class="form-group">
42
                <button type="submit" class="btn btn-primary">Search</button>
43
            </div>
44
        </fieldset>
45
    </form>
46
</center>
47
<br>
48
49
<?php
50
if (isset($_GET['lang']) && !empty($_GET['lang']) && isset($_GET['dir']) && is_numeric($_GET['dir'])) {
51
    // Switch for directories
52 View Code Duplication
    switch ($_GET['dir']) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
53
        case '1':
54
            $directory1 = new RecursiveDirectoryIterator($ROSDir.'base/applications');
55
            $directory2 = new RecursiveDirectoryIterator($ROSDir.'base/setup');
56
            $directory3 = new RecursiveDirectoryIterator($ROSDir.'base/shell');
57
            $directory4 = new RecursiveDirectoryIterator($ROSDir.'base/system');
58
            $directory5 = new RecursiveDirectoryIterator($ROSDir.'boot/freeldr/fdebug');
59
60
            $it = new AppendIterator();
61
            $it->append(new RecursiveIteratorIterator($directory1));
62
            $it->append(new RecursiveIteratorIterator($directory2));
63
            $it->append(new RecursiveIteratorIterator($directory3));
64
            $it->append(new RecursiveIteratorIterator($directory4));
65
            $it->append(new RecursiveIteratorIterator($directory5));
66
            break;
67
68
        case '2':
69
            $directory6 = new RecursiveDirectoryIterator($ROSDir.'dll/cpl');
70
            $directory7 = new RecursiveDirectoryIterator($ROSDir.'dll/shellext');
71
            $directory8 = new RecursiveDirectoryIterator($ROSDir.'dll/win32');
72
73
            $it = new AppendIterator();
74
            $it->append(new RecursiveIteratorIterator($directory6));
75
            $it->append(new RecursiveIteratorIterator($directory7));
76
            $it->append(new RecursiveIteratorIterator($directory8));
77
            break;
78
79
        case '3':
80
            $directory9 = new RecursiveDirectoryIterator($ROSDir.'media/themes');
81
            $directory10 = new RecursiveDirectoryIterator($ROSDir.'subsystems/mvdm/ntvdm');
82
            $directory11 = new RecursiveDirectoryIterator($ROSDir.'win32ss/user');
83
84
            $it = new AppendIterator();
85
            $it->append(new RecursiveIteratorIterator($directory9));
86
            $it->append(new RecursiveIteratorIterator($directory10));
87
            $it->append(new RecursiveIteratorIterator($directory11));
88
            break;
89
90
        // Search in source dir - only for test
91
        case '100':
92
            $directory = new RecursiveDirectoryIterator($ROSDir);
93
94
            $it = new AppendIterator();
95
            $it->append(new RecursiveIteratorIterator($directory));
96
            break;
97
98
        default:
99
            echo 'Something is wrong! Please try again.';
100
            exit;
101
    }
102
103
    function diff_versions($leftContent, $rightContent)
104
    {
105
        $leftVersion = $rightVersion = null;
0 ignored issues
show
$rightVersion 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...
$leftVersion 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...
106
107
        // FIXME: Search multi-line with ""some text""
108
        $pattern = '/^(?!FONT|\\s*\\*|\\#\\include|\\s*\\ICON)[^"\\n]*"\\K(?!\\s*(?:"|\\n))([^"]+)/m';
109
110
        if (preg_match_all($pattern, $leftContent, $matches) <= 0) {
111
            throw new Exception('Left content has no version line.');
112
        }
113
114
        $leftVersion = $matches[1];
115
116
        if (preg_match_all($pattern, $rightContent, $matches) <= 0) {
117
            throw new Exception('Right content has no version line.');
118
        }
119
120
        $rightVersion = $matches[1];
121
122
        return [
123
            'diff'         => array_intersect($leftVersion, $rightVersion),
124
            'leftVersion'  => $leftVersion,
125
            'rightVersion' => $rightVersion,
126
        ];
127
    }
128
129
    function exceptions_error_handler($severity, $message, $filename, $lineno)
130
    {
131
        if (error_reporting() == 0) {
132
            return;
133
        }
134
        if (error_reporting() & $severity) {
135
            throw new ErrorException($message, 0, $severity, $filename, $lineno);
136
        }
137
    }
138
139
    set_error_handler('exceptions_error_handler');
140
141
    $regex = new RegexIterator($it, '/^.+'.$langDir.'.+('.$originLang.')\.'.$fileExt.'$/i', RecursiveRegexIterator::GET_MATCH);
142
143
    $missing = $allStrings = 0;
144
145
    $lang = htmlspecialchars($_GET['lang']);
146
    // Search for eg. PL,Pl,pl
147
    $fileSearch = strtoupper($lang).','.ucfirst($lang).','.strtolower($lang);
148
149
    // ReactOS and Wine Strings - array
150
    $ignoredROSStrings = file($ROSSpellFilename, FILE_IGNORE_NEW_LINES);
151
    $ignoredWineStrings = file($wineSpellFilename, FILE_IGNORE_NEW_LINES);
152
153
    $regex->rewind();
154
    while ($regex->valid()) {
155
        if (!$regex->isDot()) {
156
            $file = glob($regex->getPathInfo().'/*{'.$fileSearch.'}*.'.$fileExt, GLOB_BRACE);
157
158
            $isFile = array_filter($file);
159
160
            if (empty($isFile)) {
161
                echo '<b>No translation</b> for path '.$regex->getPathInfo().'<hr>';
162
            } else {
163
                $fileContent1 = file_get_contents($regex->key());
164
                $fileContent2 = file_get_contents($file[0]);
165
166
                $array = diff_versions($fileContent1, $fileContent2);
167
168
                if ($array['diff']) {
169
                    echo $regex->getPathInfo().'<br><br>';
170
171
                    $currentMissing = $missing;
172
173
                    foreach ($array['leftVersion'] as $index => $english) {
174
                        // Catch offset error
175
                        try {
176
                            // Check if this same and ignore some words
177
                            if ($english === $array['rightVersion'][$index] && !in_array($english, $ignoredROSStrings) && !in_array($english, $ignoredWineStrings)) {
178
                                echo '<b>Missing translation:</b> '.htmlspecialchars($english).'<br>';
179
                                $missing++;
180
                            }
181
                            $allStrings++;
182
                        } catch (Exception $e) {
183
                            echo 'Missing stuff in your language<br>';
184
                            $allStrings++;
185
                            $missing++;
186
                        }
187
                    }
188
                    if ($currentMissing == $missing) {
189
                        echo 'Seems OK :) Some strings was ignored by ReactOS and Wine spell files.<br>';
190
                    }
191
192
                    echo '<hr>';
193
                }
194
            }
195
        }
196
        $regex->next();
197
    }
198
    echo "<h3>All strings for english: $allStrings</h3>";
199
    echo "<h3>Missing translations for your language ($lang): $missing</h3>";
200
201
    // Rounded percent
202
    $percent = round((($allStrings - $missing) / $allStrings) * 100, 2);
203
    echo "<h3>Language $lang translated in $percent%</h3>";
204
}
205
206
include_once 'footer.php';
207