123456789101112131415161718192021222324252627282930313233343536 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class RemoveDuplicateTranslations < ActiveRecord::Migration[6.1]
- def change
- # return if it's a new setup
- return if !Setting.exists?(name: 'system_init_done')
- # For some obsure reason, in legacy systems there was a chance that Translation records with the same locale and source
- # appeared multiple times.
- Locale.all.each do |locale|
- # Remove duplicates of all synchronized strings first.
- cleanup_duplicates_of_synchronized(locale)
- # Remove other duplicates of unsynchronized strings as well.
- cleanup_duplicates_of_unsynchronized(locale)
- end
- end
- def cleanup_duplicates_of_synchronized(locale)
- unsync_translations = Translation.where(locale: locale.locale, is_synchronized_from_codebase: false).all
- Translation.where(locale: locale.locale, is_synchronized_from_codebase: true).all.each do |t|
- unsync_translations.select { |unsync_t| unsync_t.source == t.source }.each(&:destroy)
- end
- end
- def cleanup_duplicates_of_unsynchronized(locale)
- unsync_translations = Translation.where(locale: locale.locale, is_synchronized_from_codebase: false).reorder(:id).all
- unsync_translations.each do |t|
- next if t.destroyed?
- unsync_translations.select { |check_t| check_t.id > t.id && check_t.source == t.source && !check_t.destroyed? }.each(&:destroy)
- end
- end
- end
|