Source: filestatus.phps - download
<?php
    set_time_limit
(0);//avoid Maximum execution time
    
ini_set("memory_limit","20M");  // I must read the whole file to parse it.
    
    //configration
    
$repository_path 'translate';// path to translate repositry
    
$misc_path          'misc'// path to output files
    
$db[host]             = 'localhost';
    
$db[name]           = 'arabeyes';
    
$db[tbl]                = 'proj_about';
    
$db[user]             = 'arabeyes';
    
$db[pass]            = '6ama6im';
    
    
// project name
    
$projects[] = 'actionapps';
    
$projects[] = 'debian';
    
$projects[] = 'drupal';
    
$projects[] = 'fedora';
    
$projects[] = 'freedesktop';
    
$projects[] = 'gnome';
    
$projects[] = 'kde';
    
$projects[] = 'mandriva';
    
$projects[] = 'mozilla';
    
$projects[] = 'openoffice';
    
$projects[] = 'plone';
    
$projects[] = 'wordlist';
    
    
//connect to database
    
mysql_connect($db[host],$db[user],$db[pass]);
    
mysql_select_db($db[name]);
    
//main
foreach($projects as $project){
    
$files getFiles($repository_path.'/'.$project);
    
$data =  makeTable($files);
    
$fp  fopen($misc_path.'/'.$project.'_status_bar.html','w');
    
fwrite($fp,$data);
    
fclose($fp);
    
$status = @(int) (($status[not]/$status[count])*100);
    
$sql "UPDATE `{$db[tbl]}` SET `status`='$status' WHERE `proj_name`='$project' ";
    
mysql_query($sql);
    
//print " Project <a href=misc/{$project}_status_bar.html>$project</a> Status Page Generated ($status %)<br />\n";
    
print " Project misc/{$project}_status_bar.html Status Page Generated ($status %)\n";
    
$status = array();
}

//Genrate HTML page
function makeTable($files){
    global 
$status;
    if(!
$files[0]){
        foreach(
$files as $dir){
            
$out .= makeTable($dir);
        }
        return(
$out);
    }
    
$out '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 width="100%">
    <TR bgcolor=bisque>
     <TH align=left>Filename</TH>
     <TH>Strings to Translate</TH>
     <TH>Strings Translated (done)</TH>
     <TH align=center width="20%"></TH>
     <TH>%-done</TH>
    </TR>'
;
    foreach(
$files as $file){
        
$arr getStatus($file);
        
$percent = @(int) (($arr[not]/$arr[count])*100);
        
$out .=  "<tr>
        <td>
$arr[fn]</td>
        <td>
$arr[count]</td>
        <td>
$arr[not]</td>
        <td><div style='background:green;width:
$percent%'>&nbsp;</div></td>
        <td>
$percent %</td>
        </tr>"
;
        
$total[count] += $arr[count];
        
$total[not] += $arr[not];
    }
    
$total[percent] =  @(int) (($total[not]/$total[count])*100);
        
$out .= "<tr bgcolor=gainsboro>
        <th>Total</th>
        <td>
$total[count]</td>
        <td>
$total[not]</td>
        <td><div style='background:green;width:
$total[percent]%'>&nbsp;</div></td>
        <td>
$total[percent] %</td>
        </tr></table><br>"
;
        
$status[count] +=$total[count];
        
$status[not]        +=$total[not];
    return(
$out);
}
//get all files in path
function getFiles($path,$sub=false){
    static 
$data;
    
$handle opendir($path);
    while (
false !== ($file readdir($handle))) {
        if(
is_file($path.'/'.$file)){
            
$data[$path][] = $path.'/'.$file;
        }elseif(
$file !=='.' && $file !=='..' && $file !=='.svn'){
            
getFiles($path.'/'.$file,true);
        }
    }
    if(!
$sub) return($data);
}
//parse po file and retuen status
function getStatus($fn){
    
$data implode('',file($fn));
    
$arr['not'] = $arr['count'] = 0;
    
//preg_match_all('/(#.+)msgid (.+)\r\nmsgstr (.+)\r\n\r\n/Us',$data,$out);
    
preg_match_all('/\r\nmsgstr (.+)\r\n\r\n/Us',$data,$out);
    for(
$i=1;$i<count($out[0]);$i++){
        if(
$out[1][$i] =='""'){
            
$arr['not'] +=1;
        }
        
$arr['count'] +=1;
    }
    
$arr['fn'] = $fn;
    return(
$arr);
}
?>