--- locale.module.orig 2005-03-23 08:42:29.000000000 +0100 +++ locale.module 2005-03-25 10:10:39.180616160 +0100 @@ -142,29 +142,67 @@ // We don't have this translation cached, so get it from the DB else { - $result = db_query("SELECT s.lid, t.translation FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid WHERE s.source = '%s' AND t.locale = '%s'", $string, $locale); + $caller = debug_backtrace(); + $docroot = realpath($_SERVER['DOCUMENT_ROOT']); + $file = ereg_replace($docroot, '', $caller[1]['file']); + $basefile = basename($file); + $line = $caller[1]['line']; + $origstring = $string; + $result = db_query("SELECT s.lid, s.location, t.translation FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid WHERE s.source = '%s' AND t.locale = '%s'", $string, $locale); // Translation found - if ($trans = db_fetch_object($result)) { + while ($trans = db_fetch_object($result)) { if (!empty($trans->translation)) { - $locale_t[$string] = $trans->translation; - $string = $trans->translation; + if ($trans->location == "$file:$line") { + // We have 100% match + $locale_t[$string] = $trans->translation; + $string = $trans->translation; + $match = $trans->lid; + $rate = 100; + break; + } + elseif (eregi($basefile, $trans->location) && ($rate < 100)) { + // We have a match in the same file, but on a different line + $locale_t[$string] = $trans->translation; + $string = $trans->translation; + $match = $trans->lid; + $rate = 75; + } + elseif ($rate < 50) { + // We have a match in another file + $locale_t[$string] = $trans->translation; + $string = $trans->translation; + $match = $trans->lid; + $rate = 50; + } + } + } + // We have a translation, but not a full file:line match + if (($match) && ($rate < 100)) { + // Lets update source and target with the correct location + db_query("INSERT INTO {locales_source} (location, source) VALUES ('%s', '%s')", "$file:$line", $origstring); + if ($locale) { + $lid = db_fetch_object(db_query("SELECT lid FROM {locales_source} WHERE source = '%s' AND location = '%s'", $origstring, "$file:$line")); + db_query("INSERT INTO {locales_target} (lid, locale, translation) VALUES (%d, '%s', '%s')", $lid->lid, $locale, $string); } } // Either we have no such source string, or no translation - else { - $result = db_query("SELECT lid, source FROM {locales_source} WHERE source = '%s'", $string); - // We have no such translation + elseif (!$match) { + $result = db_query("SELECT lid, source FROM {locales_source} WHERE source = '%s' AND location = '%s'", $origstring, "$file:$line"); if ($obj = db_fetch_object($result)) { if ($locale) { - db_query("INSERT INTO {locales_target} (lid, locale) VALUES (%d, '%s')", $obj->lid, $locale); + $trans = db_fetch_object(db_query("SELECT lid FROM {locales_target} WHERE lid = '%d' AND locale = '%s'"", $obj->lid, $locale)); + // We have no such translation + if (!$trans) { + db_query("INSERT INTO {locales_target} (lid, locale) VALUES (%d, '%s')", $obj->lid, $locale); + } } } // We have no such source string else { - db_query("INSERT INTO {locales_source} (location, source) VALUES ('%s', '%s')", request_uri(), $string); + db_query("INSERT INTO {locales_source} (location, source) VALUES ('%s', '%s')", "$file:$line", $string); if ($locale) { - $lid = db_fetch_object(db_query("SELECT lid FROM {locales_source} WHERE source = '%s'", $string)); + $lid = db_fetch_object(db_query("SELECT lid FROM {locales_source} WHERE source = '%s' AND location = '%s'", $string, "$file:$line")); db_query("INSERT INTO {locales_target} (lid, locale) VALUES (%d, '%s')", $lid->lid, $locale); } } @@ -410,7 +448,7 @@ include_once 'includes/locale.inc'; switch ($_POST['op']) { case t('Export'): - _locale_export_po($_POST['edit']['langcode']); + _locale_export_po($_POST['edit']['langcode'], $_POST['edit']['filename']); break; } print theme('page', _locale_admin_export_screen());