123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <?php
- /*
- * This file is part of the symfony package.
- * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * Finds non "i18n ready" strings in an application.
- *
- * @package symfony
- * @subpackage task
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
- * @version SVN: $Id: sfI18nFindTask.class.php 8453 2008-04-14 16:39:14Z fabien $
- */
- class sfI18nFindTask extends sfBaseTask
- {
- /**
- * @see sfTask
- */
- protected function configure()
- {
- $this->addArguments(array(
- new sfCommandArgument('application', sfCommandArgument::REQUIRED, 'The application name'),
- ));
- $this->addOptions(array(
- new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
- ));
- $this->namespace = 'i18n';
- $this->name = 'find';
- $this->briefDescription = 'Finds non "i18n ready" strings in an application';
- $this->detailedDescription = <<<EOF
- The [i18n:find|INFO] task finds non internationalized strings embedded in templates:
- [./symfony i18n:find frontend|INFO]
- This task is able to find non internationalized strings in pure HTML and in PHP code:
- <p>Non i18n text</p>
- <p><?php echo 'Test' ?></p>
- As the task returns all strings embedded in PHP, you can have some false positive (especially
- if you use the string syntax for helper arguments).
- EOF;
- }
- /**
- * @see sfTask
- */
- public function execute($arguments = array(), $options = array())
- {
- $this->logSection('i18n', sprintf('find non "i18n ready" strings in the "%s" application', $arguments['application']));
- // Look in templates
- $dirs = array();
- $moduleNames = sfFinder::type('dir')->maxdepth(0)->relative()->in(sfConfig::get('sf_app_module_dir'));
- foreach ($moduleNames as $moduleName)
- {
- $dirs[] = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/templates';
- }
- $dirs[] = sfConfig::get('sf_app_dir').'/templates';
- $strings = array();
- foreach ($dirs as $dir)
- {
- $templates = sfFinder::type('file')->name('*.php')->in($dir);
- foreach ($templates as $template)
- {
- if (!isset($strings[$template]))
- {
- $strings[$template] = array();
- }
- $dom = new DomDocument('1.0', sfConfig::get('sf_charset', 'UTF-8'));
- $content = file_get_contents($template);
- // remove doctype
- $content = preg_replace('/<!DOCTYPE.*?>/', '', $content);
- @$dom->loadXML('<doc>'.$content.'</doc>');
- $nodes = array($dom);
- while ($nodes)
- {
- $node = array_shift($nodes);
- if (XML_TEXT_NODE === $node->nodeType)
- {
- if (!$node->isWhitespaceInElementContent())
- {
- $strings[$template][] = $node->nodeValue;
- }
- }
- else if ($node->childNodes)
- {
- for ($i = 0, $max = $node->childNodes->length; $i < $max; $i++)
- {
- $nodes[] = $node->childNodes->item($i);
- }
- }
- else if ('DOMProcessingInstruction' == get_class($node) && 'php' == $node->target)
- {
- // processing instruction node
- $tokens = token_get_all('<?php '.$node->nodeValue);
- foreach ($tokens as $token)
- {
- if (is_array($token))
- {
- list($id, $text) = $token;
- if (T_CONSTANT_ENCAPSED_STRING === $id)
- {
- $strings[$template][] = substr($text, 1, -1);
- }
- }
- }
- }
- }
- }
- }
- foreach ($strings as $template => $messages)
- {
- if (!$messages)
- {
- continue;
- }
- $this->logSection('i18n', sprintf('strings in "%s"', str_replace(sfConfig::get('sf_root_dir'), '', $template)), 1000);
- foreach ($messages as $message)
- {
- $this->log(" $message\n");
- }
- }
- }
- }
|