diff options
Diffstat (limited to 'langs/lib.php')
-rw-r--r-- | langs/lib.php | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/langs/lib.php b/langs/lib.php new file mode 100644 index 000000000..b238cdd4c --- /dev/null +++ b/langs/lib.php @@ -0,0 +1,271 @@ +<?php +/** +*/ + +if (isset($_SERVER['APP_MODE']) && $_SERVER['APP_MODE'] !== 'prod') { + ini_set('error_reporting', E_ALL); + ini_set('show_errors', true); + ini_set('display_errors', true); +} else { + ini_set('error_reporting', FALSE); + ini_set('show_errors', FALSE); + ini_set('display_errors', FALSE); + ini_set('log_errors', FALSE); +} + +include '../langs.php'; + +/** + * Diff two .lang files, to get: + * - strings count of each + * - missing strings (in $a, not in $b) + * - extra strings (in $b, not in $a) + * - untranslated strings (same in $a and $b, or empty in $b) + * - duplicate strings in $b + * + * @param string $a file name + * @param string $b file name + * + * @return array +*/ +function _lang_diff($a, $b) +{ + $fa = i18n::_lang_return($a); + $fb = i18n::_lang_return($b, true); // option to return duplicates + $duplicates = (isset($fb['duplicates']) ? array_pop($fb) : null); + +/* $ret = array( + 'aCount' => 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' + * or ../_nav/langs/sl.lang + * from ../_nav/langs/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' + * or ../_nav/langs/sl.po + * from ../_nav/langs/en.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); + } + $s = str_replace('/en.', '/' . $l . '.', $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, + ); +} |