1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\build\controllers;
use DirectoryIterator;
use Yii;
use yii\console\Controller;
use yii\helpers\Html;
/**
* TranslationController handles tasks related to framework translations.
*
* build translation "../docs/guide" "../docs/guide-ru" "Russian guide translation report" > report_guide_ru.html
*
* @author Alexander Makarov <sam@rmcreative.ru>
*/
class TranslationController extends Controller
{
public $defaultAction = 'report';
/**
* Creates a report about documentation updates since last update of same named translations.
*
* @param string $sourcePath the directory where the original documentation files are
* @param string $translationPath the directory where the translated documentation files are
* @param string $title custom title to use for report
* @return string
*/
public function actionReport($sourcePath, $translationPath, $title = 'Translation report')
{
$sourcePath = trim($sourcePath, '/\\');
$translationPath = trim($translationPath, '/\\');
$results = [];
$dir = new DirectoryIterator($sourcePath);
foreach ($dir as $fileinfo) {
/* @var $fileinfo DirectoryIterator */
if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
$translatedFilePath = $translationPath . '/' . $fileinfo->getFilename();
$sourceFilePath = $sourcePath . '/' . $fileinfo->getFilename();
$errors = $this->checkFiles($translatedFilePath);
$diff = empty($errors) ? $this->getDiff($translatedFilePath, $sourceFilePath) : '';
if(!empty($diff)) {
$errors[] = 'Translation outdated.';
}
$result = [
'errors' => $errors,
'diff' => $diff,
];
$results[$fileinfo->getFilename()] = $result;
}
}
// checking if there are obsolete translation files
$dir = new DirectoryIterator($translationPath);
foreach ($dir as $fileinfo) {
/* @var $fileinfo \DirectoryIterator */
if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
$translatedFilePath = $translationPath . '/' . $fileinfo->getFilename();
$errors = $this->checkFiles(null, $translatedFilePath);
if(!empty($errors)) {
$results[$fileinfo->getFilename()]['errors'] = $errors;
}
}
}
echo $this->renderFile(__DIR__ . '/views/translation/report_html.php', [
'results' => $results,
'sourcePath' => $sourcePath,
'translationPath' => $translationPath,
'title' => $title,
]);
}
/**
* Checks for files existence
*
* @param string $translatedFilePath
* @param string $sourceFilePath
* @return array errors
*/
protected function checkFiles($translatedFilePath = null, $sourceFilePath = null)
{
$errors = [];
if ($translatedFilePath !== null && !file_exists($translatedFilePath)) {
$errors[] = 'Translation does not exist.';
}
if ($sourceFilePath !== null && !file_exists($sourceFilePath)) {
$errors[] = 'Source does not exist.';
}
return $errors;
}
/**
* Getting DIFF from git
*
* @param string $translatedFilePath path pointing to translated file
* @param string $sourceFilePath path pointing to original file
* @return string DIFF
*/
protected function getDiff($translatedFilePath, $sourceFilePath)
{
$lastTranslationHash = shell_exec('git log -1 --format=format:"%H" -- ' . $translatedFilePath);
return shell_exec('git diff ' . $lastTranslationHash.'..HEAD -- ' . $sourceFilePath);
}
/**
* Adds all necessary HTML tags and classes to diff output
*
* @param string $diff DIFF
* @return string highlighted DIFF
*/
public function highlightDiff($diff)
{
$lines = explode("\n", $diff);
foreach ($lines as $key => $val) {
if (mb_substr($val, 0, 1, 'utf-8') === '@') {
$lines[$key] = '<span class="info">' . Html::encode($val) . '</span>';
}
else if (mb_substr($val, 0, 1, 'utf-8') === '+') {
$lines[$key] = '<ins>' . Html::encode($val) . '</ins>';
}
else if (mb_substr($val, 0, 1, 'utf-8') === '-') {
$lines[$key] = '<del>' . Html::encode($val) . '</del>';
}
else {
$lines[$key] = Html::encode($val);
}
}
return implode("\n", $lines);
}
}