count($fa), 'bCount' => count($fb), 'diff' => count($fa) - count($fb), ); unused var */ $missing = array(); $notrans = array(); $ka = array_keys($fa); $kb = array_keys($fb); $missing = array_diff($ka, $kb); $extra = array_diff($kb, $ka); // search for untranslated strings foreach ($fa as $k => $v) { if (array_key_exists($k, $fb)) { if ($v == $fb[$k] || '' == $fb[$k]) { $notrans[] = $k; } } } return array( 'a_name' => $a, 'b_name' => $b, 'a' => count($fa), 'b' => count($fb), 'missing' => $missing, 'notrans' => $notrans, 'extra' => $extra, 'dup_str' => $duplicates, ); } /** * Diff pot and po files, to get: * - source (pot) 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 ('about/license') * * @return array */ function _po_diff($locale, $resource) { $source_l = read_translation_file('en', $resource); $target_l = read_translation_file($locale, $resource); $pot_strings = array(); $untrans = array(); $fuzzy_or_missing = array(); foreach ($source_l as $escaped_string => $subarray) { if (!empty($subarray["msgid"])) { // filter out header $pot_strings[$escaped_string] = $subarray["msgid"]; } } foreach ($target_l as $escaped_string => $subarray) { if (!empty($subarray["msgid"])) { // filter out header $po_strings[$escaped_string] = $subarray["msgstr"][0]; } } foreach ($pot_strings as $escaped_string => $translated_string) { if (isset($po_strings[$escaped_string])) { if (empty($po_strings[$escaped_string])) { $untrans[] = $escaped_string; } } else { $fuzzy_or_missing[] = $escaped_string; } } return array( 'a' => count($pot_strings), // # of original strings // 'b' => count($po_strings), // # of target strings 'fuzzy_or_missing' => $fuzzy_or_missing, 'notrans' => $untrans, 'extra' => array(), 'dup_str' => array(), ); } /*function _lang_diff_stats($a, $b) { $diff = _lang_diff($a, $b); $diff['missing'] = count($diff['missing']); $diff['notrans'] = count($diff['notrans']); $diff['extra'] = count($diff['extra']); $diff['ok'] = (($diff['b'] - $diff['a']) == 0) ? true : false; $diff['correct'] = $diff['b'] - $diff['notrans'] - $diff['missing']; return $diff; } /**/ if ( ! function_exists('glob_recursive')) { // Does not support flag GLOB_BRACE function glob_recursive($pattern, $flags = 0) { $files = glob($pattern, $flags); // removing dirs from $files as they are not files ;) $files_wo_dirs = array(); foreach ($files as $single_file) { $single_file_as_string = str_split($single_file); $last_sign = array_pop($single_file_as_string); if($last_sign != '/') { $files_wo_dirs[] = $single_file; }; } $files = $files_wo_dirs; foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) { $files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags)); } return $files; } } /** * Create 'sl/about/license.sl.lang' * from 'en/about/license.en.lang' * * @param string $s file name with path * @param string $l locale name * * @return string */ function _lang_file_switch($s, $l) { $s = str_replace('en.lang', $l . '.lang', $s); return str_replace('en/', $l . '/', $s); } /** * Create 'sl/about/license.po' * from 'en/about/license.pot' * * @param string $s file name with path * @param string $l locale name * * @return string */ function _po_file_switch($s, $l) { if($l != 'en') { $s = str_replace('.pot', '.po', $s); } return str_replace('en/', $l . '/', $s); } /** * Create 'about/license' * from 'en/about/license.pot' or 'en/about/license.en.lang' * * @param string $source_file file name with path * @param string $extension file extension to remove * * @return string */ function _extract_resource($source_file, $extension = '.pot') { $resource = str_replace($extension, '', $source_file); return str_replace('en/', '', $resource); } function get_lang_references($pattern = '*') { return glob_recursive('en/' . $pattern, GLOB_MARK); } function get_other_langs() { $ls = glob('*'); $re = array(); foreach ($ls as $l) { if (!is_dir($l)) continue; if ($l == 'en') continue; $re[] = $l; } array_unshift($re, 'en'); return $re; } function aproximate_number_of_untranslated_constitution_lines($app_root, $lang, $unique_lines_in_eng_constitution = array()) { $constitution_readable = FALSE; $dest_constitution = sprintf('%s/%s/%s/%s_%s.md', $app_root, $lang, 'about/constitution', 'mageia.org_statutes', $lang); $number_of_unique_lines_in_eng_constitution = count($unique_lines_in_eng_constitution); $aproximate_number_of_untranslated_lines = 0; if(is_readable($dest_constitution)) { $unique_lines_in_constitution = array_unique(file($dest_constitution)); $number_of_unique_lines_in_constitution = count($unique_lines_in_constitution); $constitution_readable = TRUE; if ($lang == 'en') { $aproximate_number_of_untranslated_lines = $number_of_unique_lines_in_constitution; $untranslated_lines_in_constitution = array(); } else { $untranslated_lines_in_constitution = array_intersect($unique_lines_in_eng_constitution, $unique_lines_in_constitution); $number_of_nonunique_lines_lang_constitution = count($untranslated_lines_in_constitution); $ratio = $number_of_nonunique_lines_lang_constitution / $number_of_unique_lines_in_eng_constitution; $limit_ratio = 0.15; // limit ratio of "allowed" untranslated lines if ($ratio > $limit_ratio) { // add aproximate number of untranslated constitution lines $aproximate_number_of_untranslated_lines = $number_of_nonunique_lines_lang_constitution - round($limit_ratio * $number_of_unique_lines_in_eng_constitution); } } } else { $unique_lines_in_constitution = $unique_lines_in_eng_constitution; $aproximate_number_of_untranslated_lines = $number_of_unique_lines_in_eng_constitution; $untranslated_lines_in_constitution = $unique_lines_in_eng_constitution; } return array( 'unique_lines_in_constitution' => $unique_lines_in_constitution, 'constitution_readable' => $constitution_readable, 'untranslated_lines_in_constitution' => $untranslated_lines_in_constitution, 'aproximate_number_of_untranslated_lines' => $aproximate_number_of_untranslated_lines, ); }