Completed
Push — master ( 57d484...c45a6d )
by Adam
01:55 queued 18s
created

diff.php ➔ diff_versions()   D

Complexity

Conditions 3
Paths 3

Size

Total Lines 25
Code Lines 13

Duplication

Lines 1
Ratio 4 %

Importance

Changes 0
Metric Value
cc 3
eloc 13
nc 3
nop 2
dl 1
loc 25
rs 4.5365
c 0
b 0
f 0
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
Duplication introduced by
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
        case '100':
91
            $directory = new RecursiveDirectoryIterator($ROSDir);
92
93
            $it = new AppendIterator();
94
            $it->append(new RecursiveIteratorIterator($directory));
95
            break;
96
97
        default:
98
            echo 'Something is wrong! Please try again.';
99
            exit;
100
    }
101
102
    function diff_versions($leftContent, $rightContent)
103
    {
104
        $leftVersion = $rightVersion = null;
0 ignored issues
show
Unused Code introduced by
$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...
Unused Code introduced by
$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...
105
106
        // FIXME: Search multi-line with ""some text""
107
        $pattern = '/^(?!FONT|\\s*\\*|\\#\\include|\\s*\\ICON)[^"\\n]*"\\K(?!\\s*(?:"|\\n))([^"]+)/m';
108
109
        if (preg_match_all($pattern, $leftContent, $matches) <= 0) {
110
            throw new Exception('Left content has no version line.');
111
        }
112
113
        $leftVersion = $matches[1];
114
115
        if (preg_match_all($pattern, $rightContent, $matches) <= 0) {
116
            throw new Exception('Right content has no version line.');
117
        }
118
119
        $rightVersion = $matches[1];
120
121
        return [
122
            'diff'         => array_intersect($leftVersion, $rightVersion),
123
            'leftVersion'  => $leftVersion,
124
            'rightVersion' => $rightVersion,
125
        ];
126
    }
127
128
    function exceptions_error_handler($severity, $message, $filename, $lineno)
129
    {
130
        if (error_reporting() == 0) {
131
            return;
132
        }
133
        if (error_reporting() & $severity) {
134
            throw new ErrorException($message, 0, $severity, $filename, $lineno);
135
        }
136
    }
137
138
    set_error_handler('exceptions_error_handler');
139
140
    $regex = new RegexIterator($it, '/^.+'.$langDir.'.+('.$originLang.')\.'.$fileExt.'$/i', RecursiveRegexIterator::GET_MATCH);
141
142
    $missing = $allStrings = 0;
143
144
    $lang = htmlspecialchars($_GET['lang']);
145
    // Search for eg. PL,Pl,pl
146
    $fileSearch = strtoupper($lang).','.ucfirst($lang).','.strtolower($lang);
147
148
    // ReactOS and Wine Strings - array
149
    $ignoredROSStrings = file($ROSSpellFilename, FILE_IGNORE_NEW_LINES);
150
    $ignoredWineStrings = file($wineSpellFilename, FILE_IGNORE_NEW_LINES);
151
152
    $regex->rewind();
153
    while ($regex->valid()) {
154
        if (!$regex->isDot()) {
155
            $file = glob($regex->getPathInfo().'/*{'.$fileSearch.'}*.'.$fileExt, GLOB_BRACE);
156
157
            $isFile = array_filter($file);
158
159
            if (empty($isFile)) {
160
                echo '<b>No translation</b> for path '.$regex->getPathInfo().'<hr>';
161
            } else {
162
                $fileContent1 = file_get_contents($regex->key());
163
                $fileContent2 = file_get_contents($file[0]);
164
165
                $array = diff_versions($fileContent1, $fileContent2);
166
167
                if ($array['diff']) {
168
                    echo $regex->getPathInfo().'<br><br>';
169
170
                    $currentMissing = $missing;
171
172
                    foreach ($array['leftVersion'] as $index => $english) {
173
                        // Catch offset error
174
                        try {
175
                            // Check if this same and ignore some words
176
                            if ($english === $array['rightVersion'][$index] && !in_array($english, $ignoredROSStrings) && !in_array($english, $ignoredWineStrings)) {
177
                                echo '<b>Missing translation:</b> '.htmlspecialchars($english).'<br>';
178
                                $missing++;
179
                            }
180
                            $allStrings++;
181
                        } catch (Exception $e) {
182
                            echo 'Missing stuff in your language<br>';
183
                            $allStrings++;
184
                            $missing++;
185
                        }
186
                    }
187
                    if ($currentMissing == $missing) {
188
                        echo 'Seems OK :) Some strings was ignored by ReactOS and Wine spell files.<br>';
189
                    }
190
191
                    echo '<hr>';
192
                }
193
            }
194
        }
195
        $regex->next();
196
    }
197
    echo "<h3>All strings for english: $allStrings</h3>";
198
    echo "<h3>Missing translations for your language ($lang): $missing</h3>";
199
200
    // Rounded percent
201
    $percent = round((($allStrings - $missing) / $allStrings) * 100, 2);
202
    echo "<h3>Language $lang translated in $percent%</h3>";
203
}
204
205
include_once 'footer.php';
206