mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-26 14:26:54 +08:00
#2677: added 1.1 port of translations command
This commit is contained in:
145
build/controllers/TranslationController.php
Normal file
145
build/controllers/TranslationController.php
Normal file
@ -0,0 +1,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" --title="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 DirectoryIterator $fileinfo */
|
||||||
|
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 \DirectoryIterator $fileinfo */
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
protected 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);
|
||||||
|
}
|
||||||
|
}
|
47
build/controllers/views/translation/report_html.php
Normal file
47
build/controllers/views/translation/report_html.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
use yii\helpers\Html;
|
||||||
|
?><!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>Translation report</title>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.diff ins {
|
||||||
|
background: #cfc;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diff del {
|
||||||
|
background: #ffe6cc;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ok {
|
||||||
|
color: #99cc32;
|
||||||
|
}
|
||||||
|
|
||||||
|
.errors {
|
||||||
|
color: #cc5129;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1><?php echo Html::encode($title)?></h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><strong>Source:</strong> <?php echo Html::encode($sourcePath)?></li>
|
||||||
|
<li><strong>Translation:</strong> <?php echo Html::encode($translationPath)?></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<?php foreach($results as $name => $result):?>
|
||||||
|
<h2 class="<?php echo empty($result['errors']) ? 'ok' : 'errors'?>"><?php echo $name?></h2>
|
||||||
|
<?php foreach($result['errors'] as $error):?>
|
||||||
|
<p><?php echo Html::encode($error)?></p>
|
||||||
|
<?php endforeach ?>
|
||||||
|
<?php if(!empty($result['diff'])):?>
|
||||||
|
<code class="diff"><pre><?php echo $this->highlightDiff($result['diff'])?></pre></code>
|
||||||
|
<?php endif?>
|
||||||
|
<?php endforeach ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
Reference in New Issue
Block a user