Как перевести комментарии в *.php файлах ?

Достался в наследство проект который писали бравые китайцы. Порядка 200х файлов и все комментарии сделаны на китайском :).

Как все эти комментари автоматически ( может быть с помощью гугл транслейт) перевести на английский. Понятно что перевод будет кривой, но это лучше чем китайские комменты :)
  • Вопрос задан
  • 2969 просмотров
Пригласить эксперта
Ответы на вопрос 7
@egorinsk
Хороший повод выучить китайский, не?
Ответ написан
Комментировать
difiso
@difiso
В параллельной вселенной я космонавт
Я думаю что проще всего, на таких объемах, выучить китайский написать скрипт: выдираем коммент, спрашиваем гугл и ответом гугла заменяем или дополняем коммент в файле.
Ответ написан
Aco
@Aco
Заклинатель кода
Попробуйте так (убедитесь что у Вас включен tokenizer):
<?php

const SCRIPTS_DIR = '/data/www/framework/lib';

$dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(SCRIPTS_DIR));

$replace = array(
	'<hh user=param>' => '#PARAM#',
	'<hh user=return>' => '#RETURN#',
	'<hh user=desc>' => '#DESC#',
	'<hh user=throws>' => '#THROWS#',
	'<hh user=see>' => '#SEE#',
	'<hh user=link>' => '#LINK#',
	'<hh user=access>' => '#ACCESS#',
	'<hh user=since>' => '#SINCE#',
	'<hh user=static>' => '#STATIC#',

);

foreach($dir as $source) {
	if($dir->isDot()) {
		continue;
	}
	$file = file_get_contents($source->getPathname());
	$tokens = token_get_all($file);

	foreach($tokens as $token) {
		if(!is_array($token)) {
			continue;
		}
		if(in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
			$text = preg_replace('![\n\r][\t ]*\*!sSim', "\n", $token[1]);
			$text = str_replace(array_keys($replace), array_values($replace), $text);
			$translate = Yandex::translate($tokens[1]); //
			$translate = str_replace(array_values($replace), array_keys($replace), $text);
			$file = str_replace($tokens[1], $translate, $file);
		}
	}

	file_put_contents($source->getPathname(), $file);
}
Ответ написан
EugeneOZ
@EugeneOZ
Сочувствую.
Если точно нет шансов переписать это с нуля, то могут пригодиться:
php.net/manual/ru/reflectionclass.getdoccomment.php (для описания классов)
www.php.net/manual/ru/reflectionfunctionabstract.getdoccomment.php (для методов)
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Выдрать комментарии, как уже писали выше, можно через рефлексии. Правда это особо не поможет их заменить.

А вот обработать комментарии можно так:
function translateComments($file)
{
     $expr = "/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/";
     $source = file_get_contents($file);
     preg_match_all($expr, $comments, $source); //capture the comments
     
     foreach($matchs[0] as $id => $phpdoc){ 
          $source = str_replace($phpdoc,  translateText($phpdoc), $source); // replace the scores of empty 
     }

     file_put_contents($file, $source);
}


Пример абстрактен, но суть должна быть ясна. Хотя логично эту регулярку через preg_replace_callback прогнать.
Ответ написан
eaa
@eaa
дык… тут по идее писать-то не сильно долго:

— берем файлик.
— вытаскиваем регэкспом коммент.
— отдает гугле.
— получаем ответ.
— запихиваем вместо того, что было.

вряд ли кто именно такое писал, тут слишком специальное решение, а я делал так на перле, как описал парой строк выше, правда не текст переводить надо было, а кое-что другое подменять в тексте.

для особо любителей можно sed использовать.
Ответ написан
Комментировать
@Vampiro
Мне кажется можно скармливать всю страничку, указав перевод с китайского на английский.
Хотя сложно сказать как он будет на регулярки реагировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы