diff options
Diffstat (limited to 'modules/locale/locale.install')
-rw-r--r-- | modules/locale/locale.install | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/modules/locale/locale.install b/modules/locale/locale.install index 80b20c454..cb7cefe01 100644 --- a/modules/locale/locale.install +++ b/modules/locale/locale.install @@ -138,6 +138,74 @@ function locale_update_7003() { */ /** + * @addtogroup updates-7.x-extra + * @{ + */ + +/** + * Remove duplicates in {locales_source}. + */ +function locale_update_7004() { + // Look up all duplicates. For each set of duplicates, we select the row + // with the lowest lid as the "master" that will be preserved. + $result_source = db_query("SELECT MIN(lid) AS lid, source, context FROM {locales_source} WHERE textgroup = 'default' GROUP BY source, context HAVING COUNT(*) > 1"); + + $conflict = FALSE; + foreach ($result_source as $source) { + // Find all rows in {locales_target} that are translations of the same + // string (incl. context). + $result_target = db_query("SELECT t.lid, t.language, t.plural, t.translation FROM {locales_source} s JOIN {locales_target} t ON s.lid = t.lid WHERE s.source = :source AND s.context = :context AND s.textgroup = 'default' ORDER BY lid", array( + ':source' => $source->source, + ':context' => $source->context, + )); + + $translations = array(); + $keep_lids = array($source->lid); + foreach ($result_target as $target) { + if (!isset($translations[$target->language])) { + $translations[$target->language] = $target->translation; + if ($target->lid != $source->lid) { + // Move translation to the master lid. + db_query('UPDATE {locales_target} SET lid = :new_lid WHERE lid = :old_lid', array( + ':new_lid' => $source->lid, + ':old_lid' => $target->lid)); + } + } + elseif ($translations[$target->language] == $target->translation) { + // Delete duplicate translation. + db_query('DELETE FROM {locales_target} WHERE lid = :lid AND language = :language', array( + ':lid' => $target->lid, + ':language' => $target->language)); + } + else { + // The same string is translated into several different strings in one + // language. We do not know which is the preferred, so we keep them all. + $keep_lids[] = $target->lid; + $conflict = TRUE; + } + } + + // Delete rows in {locales_source} that are no longer referenced from + // {locales_target}. + db_delete('locales_source') + ->condition('source', $source->source) + ->condition('context', $source->context) + ->condition('textgroup', 'default') + ->condition('lid', $keep_lids, 'NOT IN') + ->execute(); + } + + if ($conflict) { + $url = 'http://drupal.org/node/746240'; + drupal_set_message('Your {locales_source} table contains duplicates that could not be removed automatically. See <a href="' . $url .'" target="_blank">' . $url . '</a> for more information.', 'warning'); + } +} + +/** + * @} End of "addtogroup updates-7.x-extra" + */ + +/** * Implements hook_uninstall(). */ function locale_uninstall() { |