Глобализация рельсов: сохраните все переводы, проверив I18n.available_locales

Можно ли сохранить все переводы, глядя на I18n.available_locales (или, может быть, какой-то другой файл конфигурации Globalize) при создании основной записи?

Я использую Globalize в сочетании с Active Admin, и я создал пользовательскую страницу только для переводов, но я бы хотел, чтобы человек, которому нужно перевести, знал, какие поля еще не переведены.

Это то, что я делаю сейчас (базовая модель), хотя я не горжусь этим. Кажется, что это было искажено без причины. Я попробовал более простое решение, которое сначала казалось верным, но оказалось, что оно не работает.

after_save :add_empty_translations

def add_empty_translations
# if the class is translatable
if (self.class.translates?)
  # get available locales 
  locales = I18n.available_locales.map do |l| l.to_s end
  # get foreign key for translated table
  foreign_key = "#{self.class.to_s.underscore}_id"
  # get translated columns
  translated_columns = self.class::Translation.column_names.select do |col| 
    !['id', 'created_at', 'updated_at', 'locale', "#{self.class.to_s.underscore}_id"].include? col 
  end
  # save current locale
  current_locale = I18n.locale
  # foreach available locale check if column was difined by user
  locales.each do |l|
    I18n.locale = l
    add_translation = true
    translated_columns.each do |col|
      add_translation = add_translation && self[col].nil?
    end
    if (add_translation)
      payload = {}
      payload[foreign_key] = self.id
      payload['locale'] = l
      self.class::Translation.create(payload)
     end
   end
   #restore locale
   I18n.locale = current_locale
 end
end

Есть ли способ сделать это с глобализацией?

1 ответ

Так как вышеупомянутое решение не работало все время, я заканчивал тем, что исправлял сам драгоценный камень следующим образом:

Globalize::ActiveRecord::Adapter.module_eval do 
  def save_translations!
    # START PATCH
    translated_columns = self.record.class::Translation.column_names.select do |col| 
        !['id', 'created_at', 'updated_at', 'locale', "#{self.record.class.to_s.underscore}_id"].include? col 
    end

    payload = {}
    translated_columns.each do |column|
        payload[column] = ""
    end

    I18n.available_locales.each do |l|
        add_translation = true
        translated_columns.each { |column| add_translation &&= stash[l][column].nil? }
        if (record.translations_by_locale[l].nil? && add_translation)
            stash[l] = payload
        end
    end
    # END PATCH

    stash.each do |locale, attrs|
        next if attrs.empty?

        translation = record.translations_by_locale[locale] ||
            record.translations.build(locale: locale.to_s)

        attrs.each do |name, value|
            value = value.val if value.is_a?(Arel::Nodes::Casted)
            translation[name] = value
        end
    end
    reset
  end
end
Другие вопросы по тегам