2017-05-24 2 views
1

Est-il possible de sauvegarder toutes les traductions en regardant I18n.available_locales (ou peut-être un autre fichier de configuration Globalize) lorsque l'enregistrement principal est créé? J'utilise Globalize en combinaison avec Active Admin et j'ai créé une page personnalisée uniquement pour les traductions mais j'aimerais que la personne qui doit traduire sache quels sont les champs à traduire.Globalize rails: Enregistrer toutes les traductions en vérifiant I18n.available_locales

C'est ce que je fais maintenant (modèle de base) même si je n'en suis pas fier. Il semble être tordu pour aucune raison que j'ai essayé une solution plus simple qui semblait d'abord être valide, mais ils se sont avérés ne pas fonctionner.

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 

Y a-t-il un moyen de le faire avec globaliser?

Répondre

1

Puisque la solution ci-dessus ne fonctionnait pas toutes les fois où je fini par rapiéçage lui-même la pierre comme il suit:

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