<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="robots" content="noindex,nofollow,nosnippet"> <title>www.mageia.org translation report</title> <style> html, body { margin: 0; padding: 0; font-family: Verdana, "Trebuchet MS", "Lucida Grande", "Lucida Sans", Verdana, Tahoma, Arial, sans-serif; } table, th, td { border:1px solid gray; border-collapse:collapse; } th { text-align: left; } td, th { font-size: 80%; padding: 0.3em; } td a div, td.progress div { float: left; } #page { padding: 1em; position: absolute; top: 128px; } .done, .partial, .add { } .done { color: darkgreen; background: lightgreen; } .partial { color: darkslategray; background: orange; } .add { color: black; background: lightgrey; } .done a, .partial a, .add a { color: inherit; padding-right: 0.5em; } .view_page { background: rgba(0, 0, 0, 0.1); border-radius: 3px; padding: 0em 0.5em; margin: 0.3em; } .bold { font-weight: bold; } .minor { font-weight: normal; font-size: smaller; } .progress { text-align: right; } .percent { width: 45px; } .stat { font-size: smaller; } </style> </head> <body class="contribute"> <header id="mgnavt"> <h1><a href="//www.mageia.org/">www.mageia.org</a> translation report</h1> <ul> <li>Please check <a href="https://wiki.mageia.org/en/Internationalisation_Team_(i18n)#Website_translation">localization Wiki page</a> for special cases for navigation and some web pages like <a href="https://wiki.mageia.org/en/Internationalisation_Team_%28i18n%29#Special_cases_of_web_pages">downloads/get, constitution, license...</a></li> </ul> </header> <div id="page"> <p>Report about differences between Transifex and our git repository is available <a href="./report_tx_git.php">here</a>.</p> <?php define('HLANG', TRUE); include 'lib.php'; $one_language = get_sane_string('l'); $one_resource = get_sane_string('r'); $one_language_all_resources = FALSE; $all_languages_only_one_resource = FALSE; $otherLangs = get_other_langs(); if (!empty($one_language) && $one_language != 'all') { if (in_array($one_language, $otherLangs)) { $one_language_all_resources = TRUE; $otherLangs = array('en', $one_language); } else { echo "<p>Language $one_language is not present in our web site yet.</p>"; } } $enFiles = array_merge(array('../_nav/langs/en.pot'), get_lang_references('*.pot')); // added navigation file if (!empty($one_resource) && $one_resource != 'all') { if (in_array($one_resource, $enFiles)) { $all_languages_only_one_resource = TRUE; $enFiles = array($one_resource); } else { echo "<p>Resource $one_resource is not present in our web site yet.</p>"; } } $num_of_enFiles = count($enFiles); $report = array(); $ok_link = '<div class="done">%s <a href="%s" title="get a copy of the file">file</a></div>'; $diff_link = '<div class="partial">%s<a href="diff.php?s=%s&l=%s" title="see detailed diff">'; $add_trans = '<div class="add"><a href="missing.php?s=%s&l=%s" class="view_page">add translation</a>%s</div>'; $unique_lines_in_eng_constitution = array(); $number_of_unique_lines_in_eng_constitution = 0; foreach ($otherLangs as $l) { foreach ($enFiles as $f) { $references = ''; $page_not_linked = ''; $old_page = ''; $resource = _extract_resource($f); $resource_filename = str_replace('index', '', $resource); $mga = array('view page' => $resource_filename); $langF = _po_file_switch($f, $l); if (strstr($f, '../_nav/langs/en.') !== FALSE) { $nav = TRUE; $dest_en = sprintf('%s/%s/%s', G_APP_ROOT, '_nav/langs', 'en.pot'); $dest_l = sprintf('%s/%s/%s', G_APP_ROOT, '_nav/langs', $l . '.po'); $langF = '../_nav/langs/' . $l . '.po' . (($l == 'en') ? 't' : ''); } else { $nav = FALSE; $dest_en = sprintf('%s/%s/%s/%s', G_APP_ROOT, 'en', $resource_filename, 'index.php'); $dest_l = sprintf('%s/%s/%s/%s', G_APP_ROOT, $l, $resource_filename, 'index.php'); } // if symlink e.g. does directly translated page exist? if ((realpath($dest_l) != realpath($dest_en)) && !$nav) { $page_not_linked = sprintf('<a href="/%s/%s">old page</a> still exists!', $l, $resource_filename); $old_page = sprintf(' by recycling <a href="/%s/%s">old page</a>', $l, $resource_filename); } $add_new_translation = sprintf($add_trans, $f, $l, $old_page); if (file_exists($langF)) { $test = _po_diff($l, $resource); $num_of_fuzzy_or_missing_strings = count($test['fuzzy_or_missing']); $num_of_untranslated_strings = count($test['notrans']); if ($nav) { $mga = array('see navigation' => ''); } else if ($resource_filename == 'downloads/get') { $mga = array( 'view page A' => 'downloads/get/index.php?q=Mageia-5-LiveCD-KDE4-en-i586-CD.iso&d=1', 'B' => 'downloads/get/index.php?q=Non_existing_file&d=1', ); } else if ($resource_filename == '2') { $mga = array( 'view page A' => '2/index.php', 'B' => '2/download_index.php', 'C' => '2/for-pc/index.php', 'D' => '2/for-server/index.php', ); } else if ($resource_filename == '3') { $mga = array( 'view page A' => '3/index.php', 'B' => '3/download_index.php', 'C' => '3/for-pc/index.php', 'D' => '3/for-server/index.php', ); } else if ($resource_filename == '4') { $mga = array( 'view page A' => '4/index.php', 'B' => '4/download_index.php', ); } else if ($resource_filename == '5') { $mga = array( 'view page A' => '5/index.php', 'B' => '5/download_index.php', ); } else if ($resource_filename == 'cauldron') { $mga = array('view page' => '6/index.php'); } else if ($resource_filename == 'documentation') { $mga = array( 'view page doc' => 'doc/index.php', 'archive' => 'doc/archive.php', ); } else if ($resource_filename == 'news') { $mga = array( 'view page A' => '', 'B' => 'community/', ); } else if ($resource_filename == 'common_footer') { $mga = array('view footer of page' => ''); } else if ($resource_filename == 'about/constitution') { $constitution_results = aproximate_number_of_untranslated_constitution_lines(G_APP_ROOT, $l, $unique_lines_in_eng_constitution); if ($l == 'en') { $unique_lines_in_eng_constitution = $constitution_results['unique_lines_in_constitution']; $number_of_unique_lines_in_eng_constitution = count($unique_lines_in_eng_constitution); } $test['a'] += $number_of_unique_lines_in_eng_constitution; // add aproximate number of lines from constitution to translate $num_of_untranslated_strings += $constitution_results['aproximate_number_of_untranslated_lines']; } else if ($resource_filename == 'about/license') { require_once('../en/about/license/license.php'); $license_numbers = load_license_numbers($l, TRUE); if ($l == 'en') { $number_of_unique_lines_in_eng_license = $license_numbers["all"]; } $test['a'] += $license_numbers["all"]; // add aproximate number of untranslated sentences from license $num_of_untranslated_strings += $license_numbers["untran"]; // add number of all license sentences } $link = ''; foreach ($mga as $k => $v) { $link .= sprintf('<a href="/%s/%s" class="view_page">%s</a>', $l, $v, $k); } $link .= $page_not_linked; // . '</div>'; if ($num_of_fuzzy_or_missing_strings === 0 && $num_of_untranslated_strings === 0) { $references .= sprintf($ok_link, $link, $langF); } else { if(($num_of_fuzzy_or_missing_strings + $num_of_untranslated_strings) < $test['a']) { $references .= sprintf($diff_link, $link, $f, $l); $fuzzy = FALSE; if ($num_of_fuzzy_or_missing_strings > 0) { $references .= $num_of_fuzzy_or_missing_strings . ' fuzzy or missing'; $fuzzy = TRUE; } if ($num_of_untranslated_strings > 0) { $references .= ($fuzzy ? ', ' : '') . $num_of_untranslated_strings . ' untranslated'; } $references .= '</a></div>'; } else { $references .= $add_new_translation; } } } else { // file $langF doesn't exists $references .= $add_new_translation; $test = _po_diff('en', $resource); $num_of_fuzzy_or_missing_strings = 0; $num_of_untranslated_strings = count($test['notrans']); if ($resource_filename == 'about/constitution') { // add aproximate number of all lines from constitution $test['a'] += $number_of_unique_lines_in_eng_constitution; $num_of_untranslated_strings += $number_of_unique_lines_in_eng_constitution; } if ($resource_filename == 'about/license') { // add number of all license sentences $test['a'] += $number_of_unique_lines_in_eng_license; $num_of_untranslated_strings += $number_of_unique_lines_in_eng_license; } } $report[] = array( 'language' => $l, 'resource_filename' => $f, 'num_of_all_strings' => $test['a'], 'num_of_fuzzy_or_missing_strings' => $num_of_fuzzy_or_missing_strings, 'num_of_untranslated_strings' => $num_of_untranslated_strings, 'references' => $references, ); } } $summary = build_language_and_resource_summary($report, $all_languages_only_one_resource, $one_resource, $one_language_all_resources, $one_language); $total_num_of_strings = $summary['total_num_of_strings']; // total of all source strings $language_summary = $summary['language_summary']; $resource_summary = $summary['resource_summary']; if ($one_language_all_resources) { $report_text = '<p>Restore <a href="?l=all" title="see all languages">all languages</a>.</p>'; $count = 'One language: ' . $langs[$one_language]; $summary_text = 'Summary for each of ' . $num_of_enFiles . ' resources'; $display_array = $resource_summary; $progress = 'References</th><th>Progress'; $stats_width = '70px'; } else if ($all_languages_only_one_resource) { $report_text = '<p>Restore <a href="?r=all" title="see all resources">all resources</a>.</p>'; $count = 'Together ' . count($otherLangs) . ' languages'; $summary_text = 'Summary for resource: ' . $one_resource; $eng_language = array_shift($language_summary); // shift English for proper sorting $display_array = $language_summary; $stats_width = '70px'; $progress = 'References</th><th>Progress'; } else { // all languages, all resources $report_text = ''; // <p>Overview of all languages.</p> $count = 'Together ' . count($otherLangs) . ' languages'; $summary_text = 'Summary for all ' . $num_of_enFiles . ' resources'; $eng_language = array_shift($language_summary); // shift English for proper sorting $display_array = $language_summary; $sum_for_stat = $total_num_of_strings; $stats_width = '85px'; $references = ''; $progress = 'Progress'; } // build helper arrays foreach ($display_array as $key => $row) { if ($one_language_all_resources) { $first_helper[$key] = $row['num_of_translated_strings'] / $row['num_of_all_strings']; $second_helper[$key] = $row['num_of_fuzzy_or_missing_strings'] / $row['num_of_all_strings']; $third_helper[$key] = $row['resource_filename']; } else if ($all_languages_only_one_resource) { $first_helper[$key] = $row['num_of_translated_strings'] / $row['num_of_all_strings']; $second_helper[$key] = $row['num_of_fuzzy_or_missing_strings'] / $row['num_of_all_strings']; $third_helper[$key] = $row['language']; } else { // all languages, all resources $first_helper[$key] = $row['num_of_translated_strings'] / $total_num_of_strings; $second_helper[$key] = $row['num_of_fuzzy_or_missing_strings'] / $total_num_of_strings; $third_helper[$key] = $row['language']; } } array_multisort($first_helper, SORT_DESC, $second_helper, $third_helper, $display_array); // , SORT_STRING // array_unshift($language_summary, $eng_language); // unshift English back $table_lines = array(); $progress_width = 350; foreach ($display_array as $one_member) { $translation_status = 'translated: ' . $one_member['num_of_translated_strings']; $translation_status .= ', fuzzy or missing: ' . $one_member['num_of_fuzzy_or_missing_strings']; $translation_status .= ', untranslated: ' . $one_member['num_of_untranslated_strings']; if ($one_language_all_resources) { $first_clmn = $one_member['resource_filename']; $link_one = '<a href="?r=' . $first_clmn . '" title="%s">'; if ($first_clmn == '../_nav/langs/en.pot') { $frst_clmn_t = '_nav/langs/en.pot'; } else { $frst_clmn_t = str_replace('en/', '', $first_clmn); } $first_clm_text = sprintf('<span class="bold">' . $link_one . '%s</a></span>', 'see this resource only', $frst_clmn_t); $single_stat = $one_member['num_of_translated_strings']; $sum_for_stat = $one_member['num_of_all_strings']; $references = '<td>' . $one_member['references'] . '</td>'; } else if ($all_languages_only_one_resource) { $first_clmn = $one_member['language']; $link_one = '<a href="?l=' . $first_clmn . '" title="%s">'; $first_clm_text = sprintf('<span class="bold">' . $link_one . '%s</a></span>, ', 'see this language only', $langs[$first_clmn]); $single_stat = $one_member['num_of_translated_strings']; $sum_for_stat = $one_member['num_of_all_strings']; $references = '<td>' . $one_member['references'] . '</td>'; } else { // all languages, all resources $first_clmn = $one_member['language']; $link_one = '<a href="?l=' . $first_clmn . '" title="%s">'; $first_clm_text = sprintf('<span class="bold">' . $link_one . '%s</a></span>, ', 'see this language only', $langs[$first_clmn]); $first_clm_text .= sprintf('<span class="minor">%s</span>', $first_clmn); $single_stat = $one_member['num_of_translated_strings']; } $progress_tran_float = $one_member['num_of_translated_strings'] / $sum_for_stat; $progress_trans = floor($progress_tran_float * 100); $progress_tran_round = floor($progress_tran_float * $progress_width); $progress_fom_float = $one_member['num_of_fuzzy_or_missing_strings'] / $sum_for_stat; $progress_fom_round = round($progress_fom_float * $progress_width); $progress_untrans = $progress_width - $progress_tran_round - $progress_fom_round; $row = '<tr><td>' . $first_clm_text . '</td>'; $row .= $references; $row .= '<td class="progress"><div class="percent">' . $progress_trans . ' %</div>'; $row .= '<div class="stat" style="width: ' . $stats_width . ';"> (' . $single_stat . ' / ' . $sum_for_stat . ')</div></td>'; $row .= sprintf('<td>' . $link_one, $translation_status); $row .= '<div style="width: ' . $progress_tran_round . 'px; background-color: LightGreen;"> </div>' . PHP_EOL; $row .= '<div style="width: ' . $progress_fom_round . 'px; background-color: Orange;"> </div>' . PHP_EOL; $row .= '<div style="width: ' . $progress_untrans . 'px; background-color: OrangeRed;"> </div>' . PHP_EOL; $row .= '</a></td></tr>' . PHP_EOL; $table_lines[] = $row; } $table_rows = implode('', $table_lines); echo $report_text; echo <<<S <table> <thead><tr> <th>{$count}</th> <th>{$progress}</th> <th>{$summary_text}</th> </tr></thead> <tbody> {$table_rows} </tbody> </table> <hr> S; ?> <p>Source code for this website is <a href="http://gitweb.mageia.org/web/www/tree/langs/report.php">available on git</a>.</p> </div> <script src="//nav.mageia.org/js/"></script> </body> </html><?php // regenerating cache // TODO move it to the cron require_once('../en/about/license/license.php'); foreach ($otherLangs as $lang) { load_license_numbers($lang); }