#!/usr/bin/php -q
<?php

error_reporting(E_ALL);

/*
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2023 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 3.01 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available through the world-wide-web at the following url:           |
  | https://www.php.net/license/3_01.txt.                                |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | license@php.net, so we can mail you a copy immediately.              |
  +----------------------------------------------------------------------+
  | Authors : Yannick Torres <yannick@php.net>                           |
  +----------------------------------------------------------------------+
*/

if ($argc != 2) {
?>

Check for translation error and print statistics

You can see an example output for french translation here :
http://php.keliglia.com/index_error.htm

Feel free to ask me some others checks.

  Usage:
  <?php echo $argv[0]; ?> <language-code>

  Authors:Yannick Torres <yannick@php.net>

<?php
  exit;
}

// Long runtime
set_time_limit(0);

// Initializing variable from parameter
$LANG = $argv[1];

// Main directory of the PHP documentation (depends on the
// sapi used). We do need the trailing slash!
if ("cli" === php_sapi_name()) {
   if (isset($PHPDOCDIR) && is_dir($PHPDOCDIR)) { $DOCDIR = $PHPDOCDIR."/"; }
   else { $DOCDIR = "./"; }
} else { $DOCDIR = "../"; }

// =========================================================================
// Functions to get revision info and credits from a file
// =========================================================================

$final_result = array();

$nb_error['chapter'] = 0;
$nb_error['appendix'] = 0;
$nb_error['qandaentry'] = 0;
$nb_error['link'] = 0;
$nb_error['sect1'] = 0;
$nb_error['book'] = 0;
$nb_error['preface'] = 0;
$nb_error['section'] = 0;
$nb_error['varlistentry'] = 0;
$nb_error['reference'] = 0;
$nb_error['refentry'] = 0;
$nb_error['refsect1'] = 0;
$nb_error['methodsynopsis'] = 0;
$nb_error['refpurpose'] = 0;
$nb_error['seealsoMember'] = 0;
$nb_error['cdata'] = 0;
$nb_error['classsynopsis'] = 0;
$nb_error['table'] = 0;
$nb_error['para'] = 0;
$nb_error['literal'] = 0;


function do_check($en_content, $lang_content) {
global $LANG;
global $nb_error;

$result_error = array();

// We remove comment in EN and lang content
$en_content = preg_replace("/<!--(.*?)?-->/s", "", $en_content);
$lang_content = preg_replace("/<!--(.*?)?-->/s", "", $lang_content);

$retour = false;

// chapter

$en_chapter = array();
preg_match_all("/<chapter(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)xmlns:xlink=\"(.*?)\">/s", $en_content, $match);
$en_chapter["xmlid"] = $match[2];
$en_chapter["xmlns"] = $match[4];
$en_chapter["xmlnsxlink"] = $match[6];

$lang_chapter = array();
preg_match_all("/<chapter(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)xmlns:xlink=\"(.*?)\">/s", $lang_content, $match);
$lang_chapter["xmlid"] = $match[2];
$lang_chapter["xmlns"] = $match[4];
$lang_chapter["xmlnsxlink"] = $match[6];

for( $i=0; $i < count($en_chapter["xmlid"]); $i ++ ) {
 if( $en_chapter["xmlid"][$i] != $lang_chapter["xmlid"][$i] ) {
  $nb_error['chapter'] ++;

  $result_error[] = array(
   "libel" => "Error in chapter, attribut : xmlid",
   "value_en" => $en_chapter["xmlid"][$i],
   "value_lang" => $lang_chapter["xmlid"][$i],
   "type" => "chapter",
  );

 }
}

for( $i=0; $i < count($en_chapter["xmlns"]); $i ++ ) {
 if( $en_chapter["xmlns"][$i] != $lang_chapter["xmlns"][$i] ) {
  $nb_error['chapter'] ++;
  $result_error[] = array(
   "libel" => "Error in chapter, attribut : xmlns",
   "value_en" => $en_chapter["xmlns"][$i],
   "value_lang" => $lang_chapter["xmlns"][$i],
   "type" => "chapter",
  );
 }
}

for( $i=0; $i < count($en_chapter["xmlnsxlink"]); $i ++ ) {
 if( $en_chapter["xmlnsxlink"][$i] != $lang_chapter["xmlnsxlink"][$i] ) {
  $nb_error['chapter'] ++;
  $result_error[] = array(
   "libel" => "Error in chapter, attribut : xmlns:xlink",
   "value_en" => $en_chapter["xmlnsxlink"][$i],
   "value_lang" => $lang_chapter["xmlnsxlink"][$i],
   "type" => "chapter",
  );
 }
}

// END : chapter

// appendix

$en_appendix = array();
preg_match_all("/<appendix(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)xmlns:xlink=\"(.*?)\">/s", $en_content, $match);
$en_appendix["xmlid"] = $match[2];
$en_appendix["xmlns"] = $match[4];
$en_appendix["xmlnsxlink"] = $match[6];

$lang_appendix = array();
preg_match_all("/<appendix(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)xmlns:xlink=\"(.*?)\">/s", $lang_content, $match);
$lang_appendix["xmlid"] = $match[2];
$lang_appendix["xmlns"] = $match[4];
$lang_appendix["xmlnsxlink"] = $match[6];

for( $i=0; $i < count($en_appendix["xmlid"]); $i ++ ) {
 if( $en_appendix["xmlid"][$i] != $lang_appendix["xmlid"][$i] ) {
  $nb_error['appendix'] ++;
  $result_error[] = array(
   "libel" => "Error in appendix, attribut : xmlid",
   "value_en" => $en_appendix["xmlid"][$i],
   "value_lang" => $lang_appendix["xmlid"][$i],
   "type" => "appendix",
  );

 }
}

for( $i=0; $i < count($en_appendix["xmlns"]); $i ++ ) {
 if( $en_appendix["xmlns"][$i] != $lang_appendix["xmlns"][$i] ) {
  $nb_error['appendix'] ++;
  $result_error[] = array(
   "libel" => "Error in appendix, attribut : xmlns",
   "value_en" => $en_appendix["xmlns"][$i],
   "value_lang" => $lang_appendix["xmlns"][$i],
   "type" => "appendix",
  );

 }
}

for( $i=0; $i < count($en_appendix["xmlnsxlink"]); $i ++ ) {
 if( $en_appendix["xmlnsxlink"][$i] != $lang_appendix["xmlnsxlink"][$i] ) {
  $nb_error['appendix'] ++;
  $result_error[] = array(
   "libel" => "Error in appendix, attribut : xmlns:xlink",
   "value_en" => $en_appendix["xmlnsxlink"][$i],
   "value_lang" => $lang_appendix["xmlnsxlink"][$i],
   "type" => "appendix",
  );

 }
}
// END : appendix

// qandaentry

$en_qandaentry = array();
preg_match_all("/<qandaentry(\s.*?)xml:id=\"(.*?)\">/s", $en_content, $match);
$en_qandaentry = $match[2];

$lang_qandaentry = array();
preg_match_all("/<qandaentry(\s.*?)xml:id=\"(.*?)\">/s", $lang_content, $match);
$lang_qandaentry = $match[2];

for( $i=0; $i < count($en_qandaentry); $i ++ ) {
 if( $en_qandaentry[$i] != $lang_qandaentry[$i] ) {
  $nb_error['qandaentry'] ++;
  $result_error[] = array(
   "libel" => "Error in qandaentry, attribut : xml:id",
   "value_en" => $en_qandaentry[$i],
   "value_lang" => $lang_qandaentry[$i],
   "type" => "qandaentry",
  );

 }
}

// END : qandaentry

// linkend

$en_linkend = array();
preg_match_all("/<link(\s.*?)linkend=(\"|')(.*?)(\"|')(\s.*)?(\/)?>/s", $en_content, $match);
$en_linkend = $match[3];

$lang_linkend = array();
preg_match_all("/<link(\s.*?)linkend=(\"|')(.*?)(\"|')(\s.*)?(\/)?>/s", $lang_content, $match);
$lang_linkend = $match[3];

for( $i=0; $i < count($en_linkend); $i ++ ) {
 if( isset($lang_linkend[$i]) && $en_linkend[$i] != $lang_linkend[$i]  && $en_linkend[$i] != 'somethingelse' ) {
  $nb_error['link'] ++;
  $result_error[] = array(
   "libel" => "Error in link, attribut : linkend $i",
   "value_en" => $en_linkend[$i],
   "value_lang" => $lang_linkend[$i],
   "type" => "link",
  );

 }
}
// END : linkend


// link:href

$en_linkhref = array();
preg_match_all("/<link(\s.*?)xlink:href=\"(.*?)\">/s", $en_content, $match);
$en_linkhref = $match[2];

$lang_linkhref = array();
preg_match_all("/<link(\s.*?)xlink:href=\"(.*?)\">/s", $lang_content, $match);
$lang_linkhref = $match[2];

for( $i=0; $i < count($en_linkhref); $i ++ ) {
 if( isset($lang_linkhref[$i]) && $en_linkhref[$i] != $lang_linkhref[$i] ) {
  $nb_error['link'] ++;
  $result_error[] = array(
   "libel" => "Error in link, attribut : linkend",
   "value_en" => $en_linkhref[$i],
   "value_lang" => $lang_linkhref[$i],
   "type" => "link",
  );

 }
}
// END : link:href


// sect1

$en_sect1 = array();
preg_match_all("/<sect1(\s.*?)xml:id=\"(.*?)\"(\s.*?)?>/s", $en_content, $match);
$en_sect1 = $match[2];

$lang_sect1 = array();
preg_match_all("/<sect1(\s.*?)xml:id=\"(.*?)\"(\s.*?)?>/s", $lang_content, $match);
$lang_sect1 = $match[2];

for( $i=0; $i < count($en_sect1); $i ++ ) {
 if( isset($lang_sect1[$i]) && $en_sect1[$i] != $lang_sect1[$i] ) {
  $nb_error['sect1'] ++;
  $result_error[] = array(
   "libel" => "Error in sect1, attribut : xml:id",
   "value_en" => $en_sect1[$i],
   "value_lang" => $lang_sect1[$i],
   "type" => "sect1",
  );

 }
}
// END : sect1



// book

$en_book = array();
preg_match_all("/<book(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)xmlns:xlink=\"(.*?)\">/s", $en_content, $match);
$en_book["xmlid"] = $match[2];
$en_book["xmlns"] = $match[4];
$en_book["xmlnsxlink"] = $match[6];

$lang_book = array();
preg_match_all("/<book(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)xmlns:xlink=\"(.*?)\">/s", $lang_content, $match);
$lang_book["xmlid"] = $match[2];
$lang_book["xmlns"] = $match[4];
$lang_book["xmlnsxlink"] = $match[6];

for( $i=0; $i < count($en_book["xmlid"]); $i ++ ) {
 if( $en_book["xmlid"][$i] != $lang_book["xmlid"][$i] ) {
  $nb_error['book'] ++;
  $result_error[] = array(
   "libel" => "Error in book, attribut : xmlid",
   "value_en" => $en_book["xmlid"][$i],
   "value_lang" => $lang_book["xmlid"][$i],
   "type" => "book",
  );

 }
}

for( $i=0; $i < count($en_book["xmlns"]); $i ++ ) {
 if( $en_book["xmlns"][$i] != $lang_book["xmlns"][$i] ) {
  $nb_error['book'] ++;
  $result_error[] = array(
   "libel" => "Error in book, attribut : xmlns",
   "value_en" => $en_book["xmlns"][$i],
   "value_lang" => $lang_book["xmlns"][$i],
   "type" => "book",
  );

 }
}

for( $i=0; $i < count($en_book["xmlnsxlink"]); $i ++ ) {
 if( $en_book["xmlnsxlink"][$i] != $lang_book["xmlnsxlink"][$i] ) {
  $nb_error['book'] ++;
  $result_error[] = array(
   "libel" => "Error in book, attribut : xmlns:xlink",
   "value_en" => $en_book["xmlnsxlink"][$i],
   "value_lang" => $lang_book["xmlnsxlink"][$i],
   "type" => "book",
  );
 }
}

// END : book


// preface

$en_preface = array();
preg_match_all("/<preface(\s.*?)xml:id=\"(.*?)\"(\s.*?)?>/s", $en_content, $match);
$en_preface = $match[2];

$lang_preface = array();
preg_match_all("/<preface(\s.*?)xml:id=\"(.*?)\"(\s.*?)?>/s", $lang_content, $match);
$lang_preface = $match[2];

for( $i=0; $i < count($en_preface); $i ++ ) {
 if( $en_preface[$i] != $lang_preface[$i] ) {
  $nb_error['preface'] ++;
  $result_error[] = array(
   "libel" => "Error in preface, attribut : xml:id",
   "value_en" => $en_preface[$i],
   "value_lang" => $lang_preface[$i],
   "type" => "preface",
  );

 }
}
// END : preface

// section

$en_section = array();
preg_match_all("/<section(\s.*?)xml:id=(\"|')(.*?)(\"|')(\s.*?)?>/s", $en_content, $match);
$en_section["xmlid"] = $match[3];

$lang_section = array();
preg_match_all("/<section(\s.*?)xml:id=(\"|')(.*?)(\"|')(\s.*?)?>/s", $lang_content, $match);
$lang_section["xmlid"] = $match[3];

for( $i=0; $i < count($en_section["xmlid"]); $i ++ ) {
 if( $en_section["xmlid"][$i] != $lang_section["xmlid"][$i] ) {
  $nb_error['section'] ++;
  $result_error[] = array(
   "libel" => "Error in section, attribut : xmlid",
   "value_en" => $en_section["xmlid"][$i],
   "value_lang" => $lang_section["xmlid"][$i],
   "type" => "section",
  );

 }
}


// END : section



// varlistentry

$en_varlistentry = array();
preg_match_all("/<varlistentry(\s.*?)xml:id=\"(.*?)\"(\s.*?)?>/s", $en_content, $match);
$en_varlistentry = $match[2];

$lang_varlistentry = array();
preg_match_all("/<varlistentry(\s.*?)xml:id=\"(.*?)\"(\s.*?)?>/s", $lang_content, $match);
$lang_varlistentry = $match[2];

for( $i=0; $i < count($en_varlistentry); $i ++ ) {
 if( $en_varlistentry[$i] != $lang_varlistentry[$i] ) {
  $nb_error['varlistentry'] ++;
  $result_error[] = array(
   "libel" => "Error in varlistentry, attribut : xml:id",
   "value_en" => $en_varlistentry[$i],
   "value_lang" => $lang_varlistentry[$i],
   "type" => "varlistentry",
  );
 }
}
// END : varlistentry

// reference

$en_reference = array();
preg_match_all("/<reference(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)?>/s", $en_content, $match);
$en_reference["xmlid"] = $match[2];
$en_reference["xmlns"] = $match[4];

$lang_reference = array();
preg_match_all("/<reference(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)?>/s", $lang_content, $match);
$lang_reference["xmlid"] = $match[2];
$lang_reference["xmlns"] = $match[4];

for( $i=0; $i < count($en_reference["xmlid"]); $i ++ ) {
 if( $en_reference["xmlid"][$i] != $lang_reference["xmlid"][$i] ) {
  $nb_error['reference'] ++;
  $result_error[] = array(
   "libel" => "Error in reference, attribut : xmlid",
   "value_en" => $en_reference["xmlid"][$i],
   "value_lang" => $lang_reference["xmlid"][$i],
   "type" => "reference",
  );

 }
}

for( $i=0; $i < count($en_reference["xmlns"]); $i ++ ) {
 if( $en_reference["xmlns"][$i] != $lang_reference["xmlns"][$i] ) {
  $nb_error['reference'] ++;
  $result_error[] = array(
   "libel" => "Error in reference, attribut : xmlns",
   "value_en" => $en_reference["xmlns"][$i],
   "value_lang" => $lang_reference["xmlns"][$i],
   "type" => "reference",
  );
 }
}

// END : reference

// refentry

$en_refentry = array();
preg_match_all("/<refentry(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)?>/s", $en_content, $match);
$en_refentry["xmlid"] = $match[2];
$en_refentry["xmlns"] = $match[4];

$lang_refentry = array();
preg_match_all("/<refentry(\s.*?)xml:id=\"(.*?)\"(\s.*?)xmlns=\"(.*?)\"(\s.*?)?>/s", $lang_content, $match);
$lang_refentry["xmlid"] = $match[2];
$lang_refentry["xmlns"] = $match[4];

for( $i=0; $i < count($en_refentry["xmlid"]); $i ++ ) {
 if( $en_refentry["xmlid"][$i] != $lang_refentry["xmlid"][$i] ) {
  $nb_error['refentry'] ++;
  $result_error[] = array(
   "libel" => "Error in refentry, attribut : xmlid",
   "value_en" => $en_refentry["xmlid"][$i],
   "value_lang" => $lang_refentry["xmlid"][$i],
   "type" => "refentry",
  );
 }
}

for( $i=0; $i < count($en_refentry["xmlns"]); $i ++ ) {
 if( $en_refentry["xmlns"][$i] != $lang_refentry["xmlns"][$i] ) {
  $nb_error['refentry'] ++;
  $result_error[] = array(
   "libel" => "Error in refentry, attribut : xmlns",
   "value_en" => $en_refentry["xmlns"][$i],
   "value_lang" => $lang_refentry["xmlns"][$i],
   "type" => "refentry",
  );

 }
}


// END : refentry


// refsect1

$en_refsect1 = array();
preg_match_all("/<refsect1(\s.*?)role=\"(.*?)\"(\s.*?)?>/s", $en_content, $match);
$en_refsect1 = $match[2];

$lang_refsect1 = array();
preg_match_all("/<refsect1(\s.*?)role=\"(.*?)\"(\s.*?)?>/s", $lang_content, $match);
$lang_refsect1 = $match[2];

for( $i=0; $i < count($en_refsect1); $i ++ ) {
 if( isset($lang_refsect1[$i]) && $en_refsect1[$i] != $lang_refsect1[$i] ) {
  $nb_error['refsect1'] ++;
  $result_error[] = array(
   "libel" => "Error in refsect1, attribut : xml:id",
   "value_en" => $en_refsect1[$i],
   "value_lang" => $lang_refsect1[$i],
   "type" => "refsect1",
  );
 }
}
// END : refsect1



// methodsynopsis

$en_methodsynopsis = array();
preg_match_all("/<methodsynopsis>(\s.*?)<\/methodsynopsis>/s", $en_content, $match);

for( $i = 0; $i < count($match[1]); $i++) {

preg_match_all("/<type>(.*?)<\/type><methodname>(.*?)<\/methodname>/s", $match[1][$i], $match2);


if( isset($match2[2][0]) && isset($match2[1][0]) ) {

$en_methodsynopsis[$i]['methodname']['name'] = $match2[2][0];
$en_methodsynopsis[$i]['methodname']['type'] = $match2[1][0];

preg_match_all("/<methodparam(( choice=\"opt\")|( choice='opt'))?><type>(.*?)<\/type><parameter(( role=\"reference\")|( role='reference'))?>(.*?)<\/parameter><\/methodparam>/s", $match[1][$i], $match2);


$en_methodsynopsis[$i]['methodparam']['parameter'] = $match2[8];
$en_methodsynopsis[$i]['methodparam']['type']      = $match2[4];

for( $j=0; $j < count($match2[1]); $j++) {

 if( trim($match2[1][$j]) == 'choice="opt"' || trim($match2[1][$j]) == "choice='opt'" ) { $en_methodsynopsis[$i]['methodparam']['optionnel'][$j] = 1; }
 else { $en_methodsynopsis[$i]['methodparam']['optionnel'][$j] = 0; }

}

for( $j=0; $j < count($match2[5]); $j++) {

 if( trim($match2[5][$j]) == 'role="reference"' || trim($match2[5][$j]) == "role='reference'" ) { $en_methodsynopsis[$i]['methodparam']['role'][$j] = 1; }
 else { $en_methodsynopsis[$i]['methodparam']['role'][$j] = 0; }

}


}

}

$lang_methodsynopsis = array();
preg_match_all("/<methodsynopsis>(\s.*?)<\/methodsynopsis>/s", $lang_content, $match);

for( $i = 0; $i < count($match[1]); $i++) {

preg_match_all("/<type>(.*?)<\/type><methodname>(.*?)<\/methodname>/s", $match[1][$i], $match2);

if( isset($match2[2][0]) && isset($match2[1][0]) ) {

$lang_methodsynopsis[$i]['methodname']['name'] = $match2[2][0];
$lang_methodsynopsis[$i]['methodname']['type'] = $match2[1][0];

preg_match_all("/<methodparam(( choice=\"opt\")|( choice='opt'))?><type>(.*?)<\/type><parameter(( role=\"reference\")|( role='reference'))?>(.*?)<\/parameter><\/methodparam>/s", $match[1][$i], $match2);

$lang_methodsynopsis[$i]['methodparam']['parameter'] = $match2[8];
$lang_methodsynopsis[$i]['methodparam']['type']      = $match2[4];

for( $j=0; $j < count($match2[1]); $j++) {

 if( trim($match2[1][$j]) == 'choice="opt"' || trim($match2[1][$j]) == "choice='opt'" ) { $lang_methodsynopsis[$i]['methodparam']['optionnel'][$j] = 1; }
 else { $lang_methodsynopsis[$i]['methodparam']['optionnel'][$j] = 0; }

}


for( $j=0; $j < count($match2[5]); $j++) {

 if( trim($match2[5][$j]) == 'role="reference"' ) { $lang_methodsynopsis[$i]['methodparam']['role'][$j] = 1; }
 else { $lang_methodsynopsis[$i]['methodparam']['role'][$j] = 0; }

}

}

}


// Verify
for( $i=0; $i < count($en_methodsynopsis); $i++) {

 if( isset($en_methodsynopsis[$i]['methodname']['name']) ) {

  if( !isset($lang_methodsynopsis[$i]['methodname']['name']) ) { $lang_methodsynopsis[$i]['methodname']['name'] = ''; }

  // methodname
  if( $en_methodsynopsis[$i]['methodname']['name'] != $lang_methodsynopsis[$i]['methodname']['name'] ) {
   $nb_error['methodsynopsis'] ++;
   $result_error[] = array(
    "libel" => "Error in methodsynopsis, methodname :",
    "value_en" => $en_methodsynopsis[$i]['methodname']['name'],
    "value_lang" => $lang_methodsynopsis[$i]['methodname']['name'],
    "type" => "methodsynopsis_methodname",
   );

  }

 }

 if( isset($en_methodsynopsis[$i]['methodname']['type']) ) {

   if( !isset($lang_methodsynopsis[$i]['methodname']['type']) ) { $lang_methodsynopsis[$i]['methodname']['type'] = ''; }

   if( $en_methodsynopsis[$i]['methodname']['type'] != $lang_methodsynopsis[$i]['methodname']['type'] ) {
    $nb_error['methodsynopsis'] ++;
    $result_error[] = array(
     "libel" => "Error in methodsynopsis, methodname, type :",
     "value_en" => $en_methodsynopsis[$i]['methodname']['type'],
     "value_lang" => $lang_methodsynopsis[$i]['methodname']['type'],
     "type" => "methodsynopsis_type",
    );

   }
 }

 if( isset($en_methodsynopsis[$i]['methodparam']['parameter']) ) {

 // methodparam
 if( !isset($en_methodsynopsis[$i]['methodparam']['parameter']) ) { $en_methodsynopsis[$i]['methodparam']['parameter'] = array(); }

 if( !isset($lang_methodsynopsis[$i]['methodparam']['parameter']) ) { $lang_methodsynopsis[$i]['methodparam']['parameter'] = array(); }

 if( count($en_methodsynopsis[$i]['methodparam']['parameter']) != count($lang_methodsynopsis[$i]['methodparam']['parameter']) ) {

    $nb_error['methodsynopsis'] ++;
    $result_error[] = array(
     "libel" => "Error : There is ".count($en_methodsynopsis[$i]['methodparam']['parameter'])." methodparam(s) in EN, ".count($lang_methodsynopsis[$i]['methodparam']['parameter'])." in $LANG",
     "value_en" => "N/A",
     "value_lang" => "N/A",
     "type" => "methodsynopsis_methodparam",
    );

 }


 for( $j = 0; $j < count($en_methodsynopsis[$i]['methodparam']['parameter']); $j++ ) {

   if( isset($en_methodsynopsis[$i]['methodparam']['parameter'][$j]) ) {

     if( !isset($lang_methodsynopsis[$i]['methodparam']['parameter'][$j]) ) { $lang_methodsynopsis[$i]['methodparam']['parameter'][$j] = ''; }

     // parameter name
     if( $en_methodsynopsis[$i]['methodparam']['parameter'][$j] != $lang_methodsynopsis[$i]['methodparam']['parameter'][$j] ) {
       $nb_error['methodsynopsis'] ++;
       $result_error[] = array(
        "libel" => "Error in methodsynopsis, methodparam, parameter :",
        "value_en" => $en_methodsynopsis[$i]['methodparam']['parameter'][$j],
        "value_lang" => $lang_methodsynopsis[$i]['methodparam']['parameter'][$j],
        "type" => "methodsynopsis_parameter_name",
       );

     }

   }

   if( isset($en_methodsynopsis[$i]['methodparam']['type'][$j]) ) {

     if( !isset($lang_methodsynopsis[$i]['methodparam']['type'][$j]) ) { $lang_methodsynopsis[$i]['methodparam']['type'][$j] = ''; }

     // parameter type
     if( $en_methodsynopsis[$i]['methodparam']['type'][$j] != $lang_methodsynopsis[$i]['methodparam']['type'][$j] ) {
       $nb_error['methodsynopsis'] ++;
       $result_error[] = array(
        "libel" => "Error in methodsynopsis, methodparam, type :",
        "value_en" => $en_methodsynopsis[$i]['methodparam']['type'][$j],
        "value_lang" => $lang_methodsynopsis[$i]['methodparam']['type'][$j],
        "type" => "methodsynopsis_parameter_type",
       );

     }

    }

    if( isset($en_methodsynopsis[$i]['methodparam']['optionnel'][$j]) ) {

     if( !isset($lang_methodsynopsis[$i]['methodparam']['optionnel'][$j]) ) { $lang_methodsynopsis[$i]['methodparam']['optionnel'][$j] = ''; }

     // is optionnel ?
     if( $en_methodsynopsis[$i]['methodparam']['optionnel'][$j] != $lang_methodsynopsis[$i]['methodparam']['optionnel'][$j] ) {

      $tmp1 = ($en_methodsynopsis[$i]['methodparam']['optionnel'][$j] == 0)? $en_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>ISN'T</strong> optionnel":$en_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>IS</strong> optionnel (choice=\"opt\")";
      $tmp2 = ($lang_methodsynopsis[$i]['methodparam']['optionnel'][$j] == 0)? $lang_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>ISN'T</strong> optionnel":$lang_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>IS</strong> optionnel (choice=\"opt\")";
       $nb_error['methodsynopsis'] ++;
       $result_error[] = array(
        "libel" => "Error in methodsynopsis, methodparam, is optionnel ?",
        "value_en" => $tmp1,
        "value_lang" => $tmp2,
        "type" => "methodsynopsis_optional",
       );

     }

    }

   if( isset($en_methodsynopsis[$i]['methodparam']['role'][$j]) ) {

     if( !isset($lang_methodsynopsis[$i]['methodparam']['role'][$j]) ) { $lang_methodsynopsis[$i]['methodparam']['role'][$j] = ''; }

     // is reference ?
     if( $en_methodsynopsis[$i]['methodparam']['role'][$j] != $lang_methodsynopsis[$i]['methodparam']['role'][$j] ) {

      $tmp1 = ($en_methodsynopsis[$i]['methodparam']['role'][$j] == 0)? $en_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>ISN'T</strong> reference":$en_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>IS</strong> reference (role=\"reference\")";
      $tmp2 = ($lang_methodsynopsis[$i]['methodparam']['role'][$j] == 0)? $lang_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>ISN'T</strong> reference":$lang_methodsynopsis[$i]['methodparam']['parameter'][$j]." <strong>IS</strong> reference (role=\"reference\")";
       $nb_error['methodsynopsis'] ++;
       $result_error[] = array(
        "libel" => "Error in methodsynopsis, methodparam, parameter, attribut : role ?",
        "value_en" => $tmp1,
        "value_lang" => $tmp2,
        "type" => "methodsynopsis_reference",
       );

     }

   }
 }
 }
}

// END : methodsynopsis

// Check if there is a space or a point at the end of refpurpose

preg_match_all("/<refpurpose>.*([^A-Za-z1-9 ])<\/refpurpose>/s", $lang_content, $match2);

if( isset($match2[1][0]) ) {

  if($match2[1][0] == '.')  {
       $nb_error['refpurpose'] ++;
       $result_error[] = array(
        "libel" => "WARNING in refpurpose : there is a point at the end of refpurpose.",
        "value_en" => "N/A",
        "value_lang" => "N/A",
        "type" => "refpurpose_space_period",
       );
  }

}

// END : space or point at the end of refpurpose


// SeeAlso section : check member

$en_seeAlsoMember = 0;
preg_match("/<refsect1 role=\"seealso\">(.*)<\/refsect1>/s", $en_content, $match2);

if (isset($match2[1])) {
    preg_match_all("/<member>(.*?)<\/member>/s", $match2[1], $match3);
    if (isset($match3[1])) {
        $en_seeAlsoMember = count($match3[1]);
    }
}

$lang_seeAlsoMember = 0;
preg_match("/<refsect1 role=\"seealso\">(.*)<\/refsect1>/s", $lang_content, $match2);

if (isset($match2[1])) {
    preg_match_all("/<member>(.*?)<\/member>/s", $match2[1], $match3);
    if (isset($match3[1])) {
        $lang_seeAlsoMember = count($match3[1]);	
    }
}

 if( $en_seeAlsoMember != $lang_seeAlsoMember ) {
       $nb_error['seealsoMember'] ++;
       $result_error[] = array(
        "libel" => "Error in seeAlso section :  $en_seeAlsoMember member in EN, and $lang_seeAlsoMember member in $LANG.",
        "value_en" => "N/A",
        "value_lang" => "N/A",
        "type" => "seealsoMember",
       );

 }

// END : SeeAlso section : check member


// CDATA section

$en_cdataSection = 0;
preg_match_all("/<!\[CDATA\[(.*?)\]\]>/s", $en_content, $match2);
$en_cdataSection = count($match2[1]);


$lang_cdataSection = 0;
preg_match_all("/<!\[CDATA\[(.*?)\]\]>/s", $lang_content, $match2);
$lang_cdataSection = count($match2[1]);


 if( $en_cdataSection != $lang_cdataSection ) {
       $nb_error['cdata'] ++;
       $result_error[] = array(
        "libel" => "Error about CDATA section :  $en_cdataSection section in EN, and $lang_cdataSection section in $LANG.",
        "value_en" => "N/A",
        "value_lang" => "N/A",
        "type" => "cdata",
       );

 }

// END : CDATA section

// classsynopsis

$en_classsynopsis = array();
preg_match_all("/<classsynopsis>(\s.*?)<\/classsynopsis>/s", $en_content, $match);

for( $i = 0; $i < count($match[1]); $i++) {

  preg_match_all("/<ooclass><classname>(.*?)<\/classname><\/ooclass>/s", $match[1][$i], $match2);

  ( isset($match2[1][0]) ) ? $en_classsynopsis[$i]['ooclass']['classname'] = $match2[1][0] : $en_classsynopsis[$i]['ooclass']['classname'] = '';

  preg_match_all("/<fieldsynopsis><type>(.*?)<\/type><varname>(.*?)<\/varname><\/fieldsynopsis>/s", $match[1][$i], $match2);


  $en_classsynopsis[$i]['fieldsynopsis']['varname'] = $match2[2];
  $en_classsynopsis[$i]['fieldsynopsis']['type']      = $match2[1];

}

$lang_classsynopsis = array();
preg_match_all("/<classsynopsis>(\s.*?)<\/classsynopsis>/s", $lang_content, $match);

for( $i = 0; $i < count($match[1]); $i++) {

  preg_match_all("/<ooclass><classname>(.*?)<\/classname><\/ooclass>/s", $match[1][$i], $match2);

  ( isset($match2[1][0]) ) ? $lang_classsynopsis[$i]['ooclass']['classname'] = $match2[1][0] : $lang_classsynopsis[$i]['ooclass']['classname'] = '';

  preg_match_all("/<fieldsynopsis><type>(.*?)<\/type><varname>(.*?)<\/varname><\/fieldsynopsis>/s", $match[1][$i], $match2);


  $lang_classsynopsis[$i]['fieldsynopsis']['varname'] = $match2[2];
  $lang_classsynopsis[$i]['fieldsynopsis']['type']      = $match2[1];


}

// Verify
for( $i=0; $i < count($en_classsynopsis); $i++) {

 if( !isset($lang_classsynopsis[$i]['ooclass']['classname']) ) { $lang_classsynopsis[$i]['ooclass']['classname'] = ''; }

 // fieldsynopsis
 if( $en_classsynopsis[$i]['ooclass']['classname'] != $lang_classsynopsis[$i]['ooclass']['classname'] ) {
    $nb_error['classsynopsis'] ++;
    $result_error[] = array(
     "libel" => "Error in ooclass, classname :",
     "value_en" => $en_classsynopsis[$i]['ooclass']['classname'],
     "value_lang" => $lang_classsynopsis[$i]['ooclass']['classname']
    );

 }


 // methodparam
 for( $j = 0; $j < count($en_classsynopsis[$i]['fieldsynopsis']['varname']); $j++ ) {

   if( !isset($lang_classsynopsis[$i]['fieldsynopsis']['varname'][$j]) ) { $lang_classsynopsis[$i]['fieldsynopsis']['varname'][$j] = ''; }

     // fieldsynopsis name
     if( $en_classsynopsis[$i]['fieldsynopsis']['varname'][$j] != $lang_classsynopsis[$i]['fieldsynopsis']['varname'][$j] ) {
       $nb_error['classsynopsis'] ++;
       $result_error[] = array(
        "libel" => "Error in fieldsynopsis, varname :",
        "value_en" => $en_classsynopsis[$i]['fieldsynopsis']['varname'][$j],
        "value_lang" => $lang_classsynopsis[$i]['fieldsynopsis']['varname'][$j],
        "type" => "methodparam_fieldsynopsis_name",
       );

     }

   if( !isset($lang_classsynopsis[$i]['fieldsynopsis']['type'][$j]) ) { $lang_classsynopsis[$i]['fieldsynopsis']['type'][$j] = ''; }

     // fieldsynopsis type
     if( $en_classsynopsis[$i]['fieldsynopsis']['type'][$j] != $lang_classsynopsis[$i]['fieldsynopsis']['type'][$j] ) {
       $nb_error['classsynopsis'] ++;
       $result_error[] = array(
        "libel" => "Error in fieldsynopsis, type :",
        "value_en" => $en_classsynopsis[$i]['fieldsynopsis']['type'][$j],
        "value_lang" => $lang_classsynopsis[$i]['fieldsynopsis']['type'][$j],
       "type" => "methodparam_fieldsynopsis_type",
       );

     }

 }
}

// END : classsynopsis


// table

$en_table = array();
preg_match_all("/<table(.*?)<\/table>/s", $en_content, $match2);
$en_table = $match2[1];

$lang_table = array();
preg_match_all("/<table(.*?)<\/table>/s", $lang_content, $match2);
$lang_table = $match2[1];

for( $i=0; $i < count($en_table); $i++) {

preg_match_all("/<row>(.*?)<\/row>/s", $en_table[$i], $match3);
preg_match_all("/<row>(.*?)<\/row>/s", $lang_table[$i], $match4);

$nb_en = count($match3[1]);
$nb_lang = count($match4[1]);

if( $nb_en != $nb_lang ) {
       $nb_error['table'] ++;
       $result_error[] = array(
        "libel" => "Error in table listing :  $nb_en row(s) in EN, and $nb_lang in $LANG.",
        "value_en" => "N/A",
        "value_lang" => "N/A",
        "type" => "table",
       );

}

}

// END : table



// para

$en_para = 0;
preg_match_all("/<para(( )(.*?))?>/s", $en_content, $match2);
$en_para = count($match2[0]);


$lang_para = 0;
preg_match_all("/<para(( )(.*?))?>/s", $lang_content, $match2);
$lang_para = count($match2[0]);


 if( $en_para != $lang_para ) {
       $nb_error['para'] ++;
       $result_error[] = array(
        "libel" => "Error in para tag :  $en_para tag <para> in EN, and $lang_para in $LANG.",
        "value_en" => "N/A",
        "value_lang" => "N/A",
        "type" => "para",
       );

 }

// END : para

// literal

$en_literal = 0;
preg_match_all("/<literal>/s", $en_content, $match2);
$en_literal = count($match2[0]);


$lang_literal = 0;
preg_match_all("/<literal>/s", $lang_content, $match2);
$lang_literal = count($match2[0]);


 if( $en_literal != $lang_literal ) {
       $nb_error['literal'] ++;
       $result_error[] = array(
        "libel" => "Error in literal tag :  $en_literal tag <literal> in EN, and $lang_literal in $LANG.",
        "value_en" => "N/A",
        "value_lang" => "N/A",
        "type" => "literal",
       );

 }

// END : literal

return $result_error;
} // do_check

function check($lang_file, $en_file) {
 global $final_result;

 if( !is_file($en_file) ) {
  return false;
 }

$en_content = file_get_contents($en_file);
$lang_content = file_get_contents($lang_file);

$result = do_check($en_content, $lang_content);

 if( count($result) > 0 ) {

  $final_result[] = array(

   "file" => $lang_file,
   "error" => $result

  );

 }

} // check

// Grabs the revision tag and stores credits from the file given
function get_tags($file, $val = "en-rev") {
    // Read the first 500 chars. The comment should be at
    // the beginning of the file

    if( !is_file($file) ) {
     return false;
    }

    $fp = @fopen($file, "r") or die ("Unable to read $file.");
    $line = fread($fp, 500);
    fclose($fp);

     // No match before the preg
     $match = array();

    // Check for English CVS revision tag (. is for $ in the preg!),
    // Return if this was needed (it should be there)
    if ($val == "en-rev") {
        preg_match("/<!-- .Revision: \d+\.(\d+) . -->/", $line, $match);
        return isset($match[1]) ? $match[1] : false;
    } else {

     // Check for the translations "revision tag"
     preg_match("/<!--\s*EN-Revision:\s*\d+\.(\d+)\s*/", $line, $match);

     // Return with found revision info (number, maint, status)
     return isset($match[1]) ? $match[1] : false;

    }

} // get_tags() function end


// =========================================================================
// A function to check directory status in translated directory
// =========================================================================

// Check the status of files in a directory of phpdoc XML files
// The English directory is passed to this function to check
function get_dir_status($dir) {

global $LANG;

    //echo "Enter in directory: ".$dir."\n";

    $en_dir = str_replace("/$LANG/", "/en/", $dir);

    // Collect files and diretcories in these arrays
    $directories = array();
    $files       = array();

    // Open the directory
    $handle = @opendir($dir);

    // Walk through all names in the directory
    while ($file = @readdir($handle)) {

      // If we found a file with one or two point as a name,
      // or a CVS directory, skip the file
      if (preg_match("/^\.{1,2}/",$file) || $file == 'CVS')
        continue;

      // JUST TEMPORARY TILL THE <TRANSLATION>/REFERENCE/FUNCTIONS.XML - ISSUE IS CLARIFIED
      // If we found a file functions.xml in the
      // <lang>/reference/ tree, skip the file
      if (
           $file == "rsusi.txt"
          || $file == "missing-ids.xml"
          || ($file == "extensions.xml" && strpos($dir, '/appendices/'))
          || $file == "README"
          || $file == "contributors.xml"
          || $file == "contributors.ent"
          || $file == "reserved.constants.xml"
          || $file == 'DO_NOT_TRANSLATE'
          || $file == 'license.xml'
          || $file == 'versions.xml'
          || strpos($dir, '/internals/')
          || strpos($dir, '/internals2/')
          || strpos($file, 'entities.') === 0
           )
        continue;

      // Collect files and directories
      if (is_dir($dir.$file)) { $directories[] = $file; }
      else { $files[] = $file; }

    }

    // Close the directory
    @closedir($handle);

    // Sort files and directories
    sort($directories);
    sort($files);

    // Go through files first
    $dir_status = array();
    foreach ($files as $file) {

        $lang_tag = get_tags($dir.$file, "lang");
        $en_tag = get_tags($en_dir.$file, "en-rev");

        if ($lang_tag === false || $en_tag === false) {
            continue;
        }

        if( "$lang_tag" == "$en_tag" ) {
          check($dir.$file, $en_dir.$file);
        }
    }

    // Then go through subdirectories, merging all the info
    // coming from subdirs to one array
    foreach ($directories as $file) {
       get_dir_status($dir.$file.'/');
    }

    // Return with collected file info in
    // this dir and subdirectories [if any]
    return $dir_status;

} // get_dir_status() function end


// =========================================================================
// Start of the program execution
// =========================================================================

// Check for directory validity
if (!@is_dir($DOCDIR . $LANG)) {
    die("The $LANG language code is not valid");
}

// Figure out generation date
$date = date("r");


// =========================================================================
// Files table goes here
// =========================================================================

// Get all files status
get_dir_status($DOCDIR.$LANG."/");

$nb_error_all = 0;

while( list($key, $val) = each($nb_error) ) {

 $nb_error_all += $val;

}

$html = '
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>PHPDOC Translation-check-tools</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
h2,td,a,p,a.ref,th { font-family:Arial,Helvetica,sans-serif; font-size:14px; }
h2,th,a.ref, .close a { color:#FFFFFF; }
td,a,p { color:#000000; }
h2     { font-size:28px; }
th     { font-weight:bold; }
.blue  { background-color:#666699; }
.act   { background-color:#68D888; }
.norev { background-color:#f4a460; }
.old   { background-color:#eee8aa; }
.crit  { background-color:#ff6347; }
.wip   { background-color:#dcdcdc; }
.type  { background-color:#ffffff; }
.r     { text-align:right }
.rb    { text-align:right; font-weight:bold; }
.b     { font-weight:bold; }
.c     { text-align:center }
body   { margin:0px 0px 0px 0px; background-color:#F0F0F0; }
table.info  { border: 1px solid #000000; margin-top: 10px; margin-left: auto; margin-right: auto; width: 600px;}
.close { float: left; }
.close a { text-decoration: none; }
//-->
</style>
</head>
<body>

<script type="text/javascript">

function closeTable(id) {

  document.getElementById(id).style.display = "none";

}

</script>

<table style="width: 100%; background-color:#666699;" border="0" cellspacing="0">
<tr>
 <td>
   <table width="100%" border="0" cellspacing="1" bgcolor="#9999CC">
    <tr>
     <td><h2 class="c">PHP Manual : Tools for translator</h2>
     <p class="c" style="font-size:12px;">Generated: '.date("r").' &nbsp; / &nbsp; Language: '.$LANG.'<br></p>
     </td>
    </tr>
   </table>
  </td>
 </tr>
</table>

<p class="c">Info : Only files who are sync with EN version are checked.</p>

';

$nb_file = count($final_result);

$html.='

<table class="info">
<tr class="blue">
 <th>Error Libel</th>
 <th>Nb error</th>
</tr>
<tr class="old">
 <td><strong>Chapter</strong><br /><em>Check "chapter" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['chapter'] == 0)?'-':'<strong>'.$nb_error['chapter'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>Appendix</strong><br /><em>Check "Appendix" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['appendix'] == 0)?'-':'<strong>'.$nb_error['appendix'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>qandaentry</strong><br /><em>Check "qandaentry" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['qandaentry'] == 0)?'-':'<strong>'.$nb_error['qandaentry'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>link</strong><br /><em>Check "link" tag &amp; attribut consistency.<br/>Error can be just a different order of link in the page.</em></td>
 <td>'.(($nb_error['link'] == 0)?'-':'<strong>'.$nb_error['link'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>sect1</strong><br /><em>Check "sect1" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['sect1'] == 0)?'-':'<strong>'.$nb_error['sect1'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>book</strong><br /><em>Check "book" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['book'] == 0)?'-':'<strong>'.$nb_error['book'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>preface</strong><br /><em>Check "preface" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['preface'] == 0)?'-':'<strong>'.$nb_error['preface']).'</td>
</tr>
<tr>
 <td><strong>section</strong><br /><em>Check "section" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['section'] == 0)?'-':'<strong>'.$nb_error['section'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>varlistentry</strong><br /><em>Check "varlistentry" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['varlistentry'] == 0)?'-':'<strong>'.$nb_error['varlistentry'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>reference</strong><br /><em>Check "reference" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['reference'] == 0)?'-':'<strong>'.$nb_error['reference'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>refentry</strong><br /><em>Check "refentry" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['refentry'] == 0)?'-':'<strong>'.$nb_error['refentry'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>refsect1</strong><br /><em>Check "refsect1" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['refsect1'] == 0)?'-':'<strong>'.$nb_error['refsect1'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>methodsynopsis</strong><br /><em>Check "methodsynopsis" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['methodsynopsis'] == 0)?'-':'<strong>'.$nb_error['methodsynopsis'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>refpurpose</strong><br /><em>Check "refpurpose" tag &amp; warn if there is a point at the end.</em></td>
 <td>'.(($nb_error['refpurpose'] == 0)?'-':'<strong>'.$nb_error['refpurpose'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>seealsoMember</strong><br /><em>Check "SeeAlso" section &amp; warn if there is less member in translation than in EN version.</em></td>
 <td>'.(($nb_error['seealsoMember'] == 0)?'-':'<strong>'.$nb_error['seealsoMember'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>cdata</strong><br /><em>Check "cdata" section &amp; warn if there is less cdata section in translation than in EN version.</em></td>
 <td>'.(($nb_error['cdata'] == 0)?'-':'<strong>'.$nb_error['cdata'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>classsynopsis</strong><br /><em>Check "classsynopsis" tag &amp; attribut consistency.</em></td>
 <td>'.(($nb_error['classsynopsis'] == 0)?'-':'<strong>'.$nb_error['classsynopsis'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>row in Table</strong><br /><em>Check number of rows in table tag.</em></td>
 <td>'.(($nb_error['table'] == 0)?'-':'<strong>'.$nb_error['table'].'</strong>').'</td>
</tr>
<tr class="old">
 <td><strong>para</strong><br /><em>Check number of para tag.</em></td>
 <td>'.(($nb_error['para'] == 0)?'-':'<strong>'.$nb_error['para'].'</strong>').'</td>
</tr>
<tr>
 <td><strong>literal</strong><br /><em>Check number of literal tag.</em></td>
 <td>'.(($nb_error['literal'] == 0)?'-':'<strong>'.$nb_error['literal'].'</strong>').'</td>
</tr>

<tr class="crit">
 <td class="r">Total :<br/>In '.$nb_file.' file(s)</td>
 <td class="b c">'.$nb_error_all.'</td>
</tr>
</table>
';

for( $i = 0; $i < $nb_file; $i++ ) {

$html.= '
<table class="info" id="table_'.$i.'">
 <tr>
  <th colspan="2" class="blue"><div class="close"><a href="javascript:void(0)" title="Hide" onclick="javascript:closeTable(\'table_'.$i.'\');">[x]</a></div>'.$final_result[$i]['file'].'</th>
 </tr>
';

  for( $j=0; $j < count($final_result[$i]['error']); $j++) {

   $html.= '
    <tr class="norev">
     <td class="b c" colspan="2">'.$final_result[$i]['error'][$j]['libel'].'</td>
    </tr>
    <tr class="act">
     <td class="r" style="width:30%;">Value in EN : </td>
     <td>'.$final_result[$i]['error'][$j]['value_en'].'</td>
    </tr>
    <tr class="old">
     <td class="r">Value in '.strtoupper($LANG).' : </td>
     <td>'.$final_result[$i]['error'][$j]['value_lang'].'</td>
    </tr>
    <tr class="type">
     <td class="r">Type : </td>
     <td>'.$final_result[$i]['error'][$j]['type'].'</td>
    </tr>
   ';

  }


$html.= '</table>';

}

$html.= '</body></html>';

echo $html;
?>
