【问题标题】:Globalize rails: Save all translations by checking I18n.available_locales全球化 Rails:通过检查 I18n.available_locales 保存所有翻译
【发布时间】:2017-05-24 15:55:04
【问题描述】:

是否可以在创建主记录时保存所有查看 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

有没有办法通过全球化来做到这一点?

【问题讨论】:

    标签: ruby-on-rails globalize


    【解决方案1】:

    由于上述解决方案并非一直有效,因此我最终修补了 gem 本身,如下所示:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2013-04-09
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      相关资源
      最近更新 更多