*
* 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
* @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 = <<Non i18n text
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('//', '', $content);
@$dom->loadXML(''.$content.'');
$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('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");
}
}
}
}