Extraire les chaines de caractère d'un script PHP

Pour traduire une application réalisée avec le Zend Framework, il faut récupérer toutes les chaines de caractères utilisées par ce dernier. Poedit ne fait pas l'affaire, car les textes ne sont pas précédées d'un mot clé comme _ qui permettrait de les identifier. J'ai donc écrit un petit script en ligne de commande qui utilise la fonction token_get_all de PHP pour extraire les chaines à traduire dans les composants Zend/Validate du framework.


#!/usr/bin/php
<?php
define('ZF_PATH', realpath(dirname(__FILE__) . '/../library'));

$rdi = new RecursiveDirectoryIterator(ZF_PATH . '/Zend/Validate');
$rii = new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::LEAVES_ONLY);

class ZendFilesIterator extends FilterIterator
{
public function accept()
{
return (substr($this->current(), -3) == 'php');
}
}

$tokens = array();

// Filtre les chaines vides, les chemins de fichier et les doublons

function filter($token) {
global $tokens;

if (!is_array($token)) return false;

if ($token[0] != T_CONSTANT_ENCAPSED_STRING) return false;

$string = trim($token[1], "'");

if (empty($string)) return false;

if (file_exists(ZF_PATH . '/' . $string)) return false;

if (strpos($string, ' ') === false) return false;

if (in_array($string, $tokens)) return false;

return true;
}

function extractStrings($file) {
global $tokens;

$fileTokens = token_get_all(file_get_contents($file));
$fileTokens = array_filter($fileTokens, 'filter');
foreach($fileTokens as $token) {
$tokens[] = trim($token[1], "'");
}
}

foreach(new ZendFilesIterator($rii) as $file) {
extractStrings($file);
}

sort($tokens);

foreach($tokens as $token) {
echo "$token\n";
}

Pour utiliser ce script, adaptez la constante ZF_PATH à votre environnement. J'ai essayé de le faire fonctionner sur l'ensemble du framework, mais le résultat n'est pas très concluant. Les développeurs devraient adopter une convention pour faciliter la localisation des chaines à traduire.

Le script affiche les chaines trouvées sur la ligne de commande. Vous pouvez les récupérer dans un fichier avec l'opérateur de redirection :


php extract_strings.php > validate.txt

Etiquettes:

Ajouter un commentaire