mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-26 06:15:19 +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