The page was crashing when at least part of the content of the page had been translated between the request showing the remote translations button and the moment people pressed the button.
53 lines
1.6 KiB
Ruby
53 lines
1.6 KiB
Ruby
class RemoteTranslation < ApplicationRecord
|
|
belongs_to :remote_translatable, polymorphic: true
|
|
|
|
validates :remote_translatable_id, presence: true
|
|
validates :remote_translatable_type, presence: true
|
|
validates :locale, presence: true
|
|
validates :locale, inclusion: { in: ->(_) { RemoteTranslations::Microsoft::AvailableLocales.available_locales }}
|
|
validate :already_translated_resource
|
|
after_create :enqueue_remote_translation
|
|
|
|
def enqueue_remote_translation
|
|
RemoteTranslations::Caller.new(self).delay.call
|
|
end
|
|
|
|
def self.for(*args)
|
|
resources_groups(*args).flatten.select { |resource| translation_empty?(resource) }.map do |resource|
|
|
new(remote_translatable: resource, locale: I18n.locale)
|
|
end
|
|
end
|
|
|
|
def self.resources_groups(*args)
|
|
feeds = args.find { |arg| arg&.first.class == Widget::Feed } || []
|
|
|
|
args.compact - [feeds] + feeds.map(&:items)
|
|
end
|
|
|
|
def self.translation_empty?(resource)
|
|
resource.class.translates? && resource.translations.where(locale: I18n.locale).empty?
|
|
end
|
|
|
|
def self.create_all(remote_translations_params)
|
|
remote_translations_params.map do |remote_translation_params|
|
|
new(remote_translation_params)
|
|
end.reject(&:already_translated?).reject(&:enqueued?).each(&:save!)
|
|
end
|
|
|
|
def already_translated_resource
|
|
if already_translated?
|
|
errors.add(:locale, :already_translated)
|
|
end
|
|
end
|
|
|
|
def enqueued?
|
|
self.class.where(remote_translatable: remote_translatable,
|
|
locale: locale,
|
|
error_message: nil).any?
|
|
end
|
|
|
|
def already_translated?
|
|
remote_translatable&.translations&.where(locale: locale).present?
|
|
end
|
|
end
|