Задать вопрос

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

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

Как все эти комментари автоматически ( может быть с помощью гугл транслейт) перевести на английский. Понятно что перевод будет кривой, но это лучше чем китайские комменты :)
  • Вопрос задан
  • 2980 просмотров
Подписаться 7 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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
Мне кажется можно скармливать всю страничку, указав перевод с китайского на английский.
Хотя сложно сказать как он будет на регулярки реагировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽