diff options
-rw-r--r-- | langs/lib.php | 57 | ||||
-rw-r--r-- | langs/report_tx_git.php | 40 |
2 files changed, 91 insertions, 6 deletions
diff --git a/langs/lib.php b/langs/lib.php index 42183c027..5fd5f50d3 100644 --- a/langs/lib.php +++ b/langs/lib.php @@ -145,6 +145,63 @@ function _po_diff($locale, $resource, $source_l = NULL, $path = NULL) ); } +/** + * Diff English and translated ts files, to get: + * - source (ts) strings count + * - missing strings in target + * - untranslated strings in target + * - empty array for extra and duplicate strings for backward compatibility + * + * @param string $locale locale name ('sl') + * @param string $resource file name ('mageiaSync') + * @param array $source_l array with source file strings (to avoid duplicated parsing) + * @param string $path directly passed path for nonlocal files + * + * @return array +*/ +function _ts_diff($locale, $resource, $source_l = NULL, $path = NULL) +{ + $source_path_filename = sprintf('%s%s_%s.ts', $path, $resource, $locale); // mageiaSync_sl.ts + $source_strings = array(); + $untranslated_strings = array(); + $obsoleted_strings = array(); + // read .ts file + $file_handle = @fopen($source_path_filename, 'r'); + if ($file_handle === false) { + // Could not open file resource + return false; + } + + // iterate over lines + while(($line = fgets($file_handle, 65536)) !== false) { + // count <source>???</source> lines + if (false !== strpos($line, '</source>')) { + preg_match_all("/(<source>)([a-z_A-Z@-]+)(<\/source>)/", $line, $source_string); + $source_strings[] = $source_string[2]; + } + // count <translation type="unfinished"></translation> lines + if (false !== strpos($line, '<translation type="unfinished">')) { + $untranslated_strings[] = $source_string[2]; + } + // count <translation type="obsolete"></translation> lines + if (false !== strpos($line, '<translation type="obsolete">')) { + array_pop($source_strings); // subtract obsoleted source strings + $obsoleted_strings[] = $source_string[2]; + } + } + fclose($file_handle); + + return array( + 'a' => count($source_strings), // # of original strings +// 'b' => , // # of target strings + 'source_strings' => $source_strings, // array of original strings + 'fuzzy_or_missing' => array(), // array of fuzzy or missing strings + 'notrans' => $untranslated_strings, // array of untranslated strings + 'extra' => $obsoleted_strings, + 'dup_str' => array(), + ); +} + /*function _lang_diff_stats($a, $b) { $diff = _lang_diff($a, $b); diff --git a/langs/report_tx_git.php b/langs/report_tx_git.php index 79bfefb87..bbc14234d 100644 --- a/langs/report_tx_git.php +++ b/langs/report_tx_git.php @@ -219,6 +219,11 @@ if ('Documentation' == $resource_type) { // 'git_path' => 'https://github.com/papoteur-mga/isodumper/raw/master/po', 'git_path' => 'http://gitweb.mageia.org/software/isodumper/plain/po', ), + array( + 'pot_name' => 'mageiaSync_en.ts', + 'tx_name' => 'mageiasync', + 'git_path' => 'http://gitweb.mageia.org/qa/MageiaSync/plain/translations/', + ), ); } @@ -292,7 +297,13 @@ function build_links($git_resource_name, $language_code, $resource_type, $stat_d $git_array = array('sr@Latn', 'uz@cyrillic'); $lang_code = str_replace($tx_array, $git_array, $language_code); } - $git_link = sprintf('%s/%s.po', $stat_data['git_path'], $lang_code); + // treat TS files differently + if (false !== strpos($stat_data['pot_name'], '_en.ts')) { + $partial_git_resource_name = substr($stat_data['pot_name'], 0, -6); // cuts '_en.ts' + $git_link = sprintf('%s%s_%s.ts', $stat_data['git_path'], $partial_git_resource_name, $lang_code); // mageiaSync_sl.ts + } else { + $git_link = sprintf('%s/%s.po', $stat_data['git_path'], $lang_code); + } } $links_and_num = build_transifex_link($language_code, 'Tx', $resource_type, $tx_resource_name) . ": "; $links_and_num .= $stat_data['tx_untran']; @@ -361,7 +372,13 @@ function generating_report($language_codes, $resource_names, $path = NULL, $pot_ $langF = '../_nav/langs/' . $l . '.po' . (($l == 'en') ? 't' : ''); } if (!is_null($path) || file_exists($langF)) { - $stat = _po_diff($l, $resource, $source_strings, $path); + // treat TS files differently + if (false !== strpos($pot_name, '_en.ts')) { + $partial_pot_name = substr($pot_name, 0, -6); // cuts '_en.ts' from mageiaSync_en.ts + $stat = _ts_diff($l, $partial_pot_name, $source_strings, $path); + } else { + $stat = _po_diff($l, $resource, $source_strings, $path); + } $num_of_fuzzy_or_missing = count($stat['fuzzy_or_missing']); } else { // file $langF doesn't exists in 'Webpages' $resource_type $stat = _po_diff('en', $resource, $source_strings); @@ -390,6 +407,7 @@ function generating_report($language_codes, $resource_names, $path = NULL, $pot_ 'web_language_code' => $web_language_code, 'num_of_not_fully_trans' => $num_of_not_fully_trans, 'webgit_path' => $path, + 'pot_name' => $pot_name, ); } } @@ -481,7 +499,12 @@ if ('Webpages' == $resource_type) { $errors['file_get_contents_failed'] = "Access to $git_path failed."; } // list all po files from links within $raw_html_dump - preg_match_all("/('>)([a-z_A-Z@-]+)(\.po<)/", $raw_html_dump, $language_codes); + if (false !== strpos($pot_name, '_en.ts')) { // treat TS files differently + $first_part_pot_name = substr($pot_name, 0, -5); // cuts 'en.ts' from mageiaSync_en.ts + preg_match_all("/('>$first_part_pot_name)([a-z_A-Z@-]+)(\.ts<)/", $raw_html_dump, $language_codes); + } else { + preg_match_all("/('>)([a-z_A-Z@-]+)(\.po<)/", $raw_html_dump, $language_codes); + } $git_language_codes = $language_codes[2]; if (is_null($wanted_language)) { $report_language_codes = $git_language_codes; @@ -542,6 +565,7 @@ foreach ($tx_resources_info as $tx_resource_info) { $git_resource_num_of_all_strings = $git_resource_info['num_of_all_strings']; $git_resource_untrans_in_lang = $git_resource_info['num_of_not_fully_trans']; $git_resource_path = $git_resource_info['webgit_path']; + $git_resource_pot_name = $git_resource_info['pot_name']; // compare l10n level if ($tx_resource_untrans_in_lang != $git_resource_untrans_in_lang) { @@ -549,6 +573,7 @@ foreach ($tx_resources_info as $tx_resource_info) { $tx_git_difference[$tx_resource_language][$git_resource_name]['tx_untranslated'] = $tx_resource_untrans_in_lang; $tx_git_difference[$tx_resource_language][$git_resource_name]['git_untranslated'] = $git_resource_untrans_in_lang; $tx_git_difference[$tx_resource_language][$git_resource_name]['webgit_path'] = $git_resource_path; + $tx_git_difference[$tx_resource_language][$git_resource_name]['pot_name'] = $git_resource_pot_name; } // it seems like a parse error if (0 == $git_resource_num_of_all_strings) { @@ -655,12 +680,12 @@ if (0 < count($git_only_resources)) { } if (0 < count($parse_errors)) { - $errors = array(); + $errors_in_parsing = array(); foreach ($parse_errors as $single_git_resource_name => $git_resource_languages) { - $errors[] = "$single_git_resource_name.po (languages: " . implode(", ", $git_resource_languages) . ")"; + $errors_in_parsing[] = "$single_git_resource_name.po (languages: " . implode(", ", $git_resource_languages) . ")"; } $reload = "Please reload the page and report this on mailing list if it persist."; - $errors['po_file_parse'] = "It seems that parsing of some resources failed: " . implode(", ", $errors) . ". $reload"; + $errors['po_file_parse'] = "It seems that parsing of some resources failed: " . implode(", ", $errors_in_parsing) . ". $reload"; } if (0 < count($nonequal_num_of_all_strings)) { @@ -719,6 +744,7 @@ if (0 < $num_of_resources_w_difference && $num_for_switch_table_to_list > $num_o $stat_data['tx_untran'] = $one_language_array[$resource_with_tx_git_diff]['tx_untranslated']; $stat_data['git_untran'] = $one_language_array[$resource_with_tx_git_diff]['git_untranslated']; $stat_data['git_path'] = $one_language_array[$resource_with_tx_git_diff]['webgit_path']; + $stat_data['pot_name'] = $one_language_array[$resource_with_tx_git_diff]['pot_name']; $cell = "<span class=\"stat\">"; $cell .= build_links($resource_with_tx_git_diff, $one_language, $resource_type, $stat_data); @@ -758,6 +784,7 @@ if (0 < $num_of_resources_w_difference) { $stat_data['tx_untran'] = $one_language_array[$one_language_resource]['tx_untranslated']; $stat_data['git_untran'] = $one_language_array[$one_language_resource]['git_untranslated']; $stat_data['git_path'] = $one_language_array[$one_language_resource]['webgit_path']; + $stat_data['pot_name'] = $one_language_array[$one_language_resource]['pot_name']; $list_of_lang_diff .= ($miss_first ? '' :', '); $list_of_lang_diff .= "<span class=\"italic\">$one_language_resource</span> <span class=\"stat\">("; @@ -782,6 +809,7 @@ if (0 < $num_of_resources_w_difference) { $stat_data['tx_untran'] = $one_language_array[$resource_with_tx_git_diff]['tx_untranslated']; $stat_data['git_untran'] = $one_language_array[$resource_with_tx_git_diff]['git_untranslated']; $stat_data['git_path'] = $one_language_array[$resource_with_tx_git_diff]['webgit_path']; + $stat_data['pot_name'] = $one_language_array[$resource_with_tx_git_diff]['pot_name']; $list_of_resource_diff .= ($miss_first ? '' :', '); $language_name = get_language_name($one_language); |