/** * Compare reference and localized raw file * * @param array $website Website data * @param string $locale Locale to analyze * @param string $filename File to analyze * * @return array Results from comparison */ public static function compareRawFiles($website, $locale, $filename) { $results = []; // Store reference file hash and last update date $reference_locale = Project::getReferenceLocale($website); $reference_filename = Project::getLocalFilePath($website, $reference_locale, $filename); if (file_exists($reference_filename)) { $reference_content = sha1_file($reference_filename); $results['reference_exists'] = true; $results['reference_url'] = Project::getPublicFilePath($website, $reference_locale, $filename); $results['reference_lastupdate'] = Utils::getSVNCommitTimestamp($reference_filename); } else { $results['reference_exists'] = false; $results['cmp_result'] = 'missing_reference'; } // Generate locale file hash and last update date $locale_filename = Project::getLocalFilePath($website, $locale, $filename); if (file_exists($locale_filename)) { $locale_content = sha1_file($locale_filename); $results['locale_exists'] = true; $results['locale_url'] = Project::getPublicFilePath($website, $locale, $filename); $results['locale_lastupdate'] = Utils::getSVNCommitTimestamp($locale_filename); if ($results['reference_exists']) { if ($locale_content == $reference_content) { $results['cmp_result'] = 'untranslated'; } elseif ($results['reference_lastupdate'] > $results['locale_lastupdate']) { // I check dates only if content is not identical $results['cmp_result'] = 'outdated'; } else { $results['cmp_result'] = 'ok'; } } } else { $results['locale_exists'] = false; $results['cmp_result'] = 'missing_locale'; } return $results; }
<?php namespace Transvision; $source = Utils::getRepoStrings(Project::getReferenceLocale($repo), $repo); $target = Utils::getRepoStrings($locale, $repo); // Set up channel selector, ignore mozilla.org $channels = Project::getSupportedRepositories(); unset($channels['mozilla_org']); $channel_selector = Utils::getHtmlSelectOptions($channels, $repo, true); // Build the target locale switcher $target_locales_list = Utils::getHtmlSelectOptions(Project::getRepositoryLocales($repo), $locale); $source = array_map(['Transvision\\AnalyseStrings', 'cleanUpEntities'], $source); $target = array_map(['Transvision\\AnalyseStrings', 'cleanUpEntities'], $target); // We need to ignore some strings because of false positives $ignored_strings = ['mail/chrome/messenger/aboutRights.dtd:rights.webservices-term4', 'suite/chrome/branding/aboutRights.dtd:rights.webservices-term4', 'toolkit/chrome/global/aboutRights.dtd:rights.webservices-term5']; $var_errors = AnalyseStrings::differences($source, $target, $repo, $ignored_strings); $error_count = count($var_errors); // Add component filter if (in_array($repo, $desktop_repos)) { // Build logic to filter components $javascript_include = ['component_filter.js']; $components = Project::getComponents(array_flip($var_errors)); $filter_block = ''; foreach ($components as $value) { $filter_block .= " <a href='#{$value}' id='{$value}' class='filter'>{$value}</a>"; } } // RTL support $direction1 = RTLSupport::getDirection($source_locale); $direction2 = RTLSupport::getDirection($locale);
// Error management if (isset($error)) { if ($error == 1) { print "<p>No entity asked for, goodbye.</p>"; } elseif ($error == 2) { print "<p>Entity does not exist for this repo, goodbye.</p>"; } return; } // We have no error, display results $page_descr = $entity; // Promote API view include VIEWS . 'templates/api_promotion.php'; ?> <table> <tr> <th>Locale</th> <th>Translation</th> <th> </th> </tr> <?php $reference_locale = Project::getReferenceLocale($repo); foreach ($translations as $locale => $translation) { $rtl_support = RTLSupport::isRTL($locale) ? 'dir="rtl"' : ''; $search_link = "/?sourcelocale={$reference_locale}&locale={$locale}&repo={$repo}&search_type=entities&recherche={$entity}&perfect_match=perfect_match"; echo "<tr id='{$locale}''>\n" . " <th><a href='#{$locale}'>{$locale}</a></th>\n" . " <td lang='#{$locale}' {$rtl_support} >" . Utils::secureText($translation) . "</td>\n" . " <td><a class='onestring_search' href='{$search_link}' title='Search for the entity in this locale'>�</a></td>\n" . "</tr>\n"; } ?> </table> <?php
} foreach ($displayed_sites as $site_index => $current_website) { $websitename = Project::getWebsiteName($current_website); $website_data_source = Project::getWebsiteDataType($current_website); if ($website_data_source == 'lang') { $table_headers = "<th>Filename</th><th>URL</th><th>Status</th><th>Translations</th><th>Strings</th><th>Words</th>"; } else { $table_headers = "<th>Filename</th>\n<th>Status</th>\n\n"; } $html_output .= "\n\t<h2 id='{$websitename}'><a href='#{$websitename}'>{$websitename}</a></h2>\n"; $html_output .= "\t<table class='listpages'>\n <thead>\n <tr>{$table_headers}</tr>\n </thead>\n <tbody>\n"; // Totals to display in the table footer $total_strings = $total_words = $total_files = 0; foreach (Project::getWebsiteFiles($current_website) as $current_filename) { if ($website_data_source == 'lang') { $reference_locale = Project::getReferenceLocale($current_website); $reference_data = LangManager::loadSource($current_website, $reference_locale, $current_filename); $get_words = function ($item) { return str_word_count(strip_tags($item)); }; $nb_words = array_sum(array_map($get_words, $reference_data['strings'])); $nb_strings = count($reference_data['strings']); $total_strings += $nb_strings; $total_words += $nb_words; $total_files++; $html_output .= "<tr>\n"; // Check if the file is obsolete for all locales if (Project::isObsoleteFile($current_website, $current_filename, 'all')) { $html_output .= " <td class='obsolete' title='Obsolete file'>{$current_filename}</td>\n"; } else { $html_output .= " <td>{$current_filename}</td>\n";
<?php namespace Transvision; $missing_repos = $available_repos = $results = ''; $missing_repos_count = $repos_count = 0; $strings = ['en-US' => [], $locale => []]; foreach ($repos as $repo) { if (isset($_GET[$repo])) { $cache_file_english = Utils::getRepoStrings(Project::getReferenceLocale($repo), $repo); if ($cache_file_english) { $cache_file_locale = Utils::getRepoStrings($locale, $repo); if ($repo == 'mozilla_org') { $cache_file_locale = array_map(function ($e) { return trim(rtrim($e, '{ok}')); }, $cache_file_locale); } // If a repo is missing, we don't have additional keys if ($cache_file_locale) { $strings['en-US'] = array_merge($strings['en-US'], $cache_file_english); $strings[$locale] = array_merge($strings[$locale], $cache_file_locale); $repos_count++; $available_repos .= '<br>' . $repos_nice_names[$repo] . ' (' . $locale . ')'; unset($cache_file_locale); } else { $missing_repos_count++; $missing_repos .= '<br>' . $repos_nice_names[$repo] . ' (' . $locale . ')'; } unset($cache_file_english); } }
/** * Load file, remove empty lines and return an array of strings * * @param array $website Website data * @param string $locale Locale to analyze * @param string $filename File to analyze * * @return array Data parsed from lang file */ public static function loadSource($website, $locale, $filename) { $is_reference_language = $locale == Project::getReferenceLocale($website); $path = Project::getLocalFilePath($website, $locale, $filename); return DotLangParser::parseFile($path, $is_reference_language); }
namespace Transvision; // Redirect old JSON API calls to new API if (isset($_GET['json'])) { // Define sane fallback values to redirect old API calls to new API calls $get_value = function ($value, $fallback) { if (isset($_GET[$value])) { // 'strings_entities' search is now called 'all' in new API return $_GET[$value] == 'strings_entities' ? 'all' : Utils::secureText($_GET[$value]); } return $fallback; }; $repo = $get_value('repo', 'release'); $type = $get_value('search_type', 'strings'); $source = $get_value('sourcelocale', Project::getReferenceLocale($repo)); $target = $get_value('locale', 'fr'); /* We need to urlencode() twice because Apache doesn't allow urls with escaped slashes, it gives a 404 instead of going through mod_rewrite see: http://www.leakon.com/archives/865 */ $terms = urlencode(urlencode(Utils::cleanString($_GET['recherche']))); $regex = []; $regex['whole'] = isset($_GET['whole_word']) ? 'whole_word=1' : ''; $regex['case'] = isset($_GET['case_sensitive']) ? 'case_sensitive=1' : ''; $regex['perfect'] = isset($_GET['perfect_match']) ? 'perfect_match=1' : ''; $regex = array_filter($regex); $regex = count($regex) > 0 ? '?' . implode('&', $regex) : ''; header('Status: 301 Moved Permanently', false, 301); header('Location:' . APP_SCHEME . "{$_SERVER['HTTP_HOST']}/api/v1/search/" . "{$type}/{$repo}/{$source}/{$target}/{$terms}/{$regex}");