Rails强制所有翻译

时间:2013-01-31 20:46:26

标签: ruby-on-rails-3 models rails-admin globalize3

由于this gist,我正在globalize3使用rails_admin。让我烦恼的是,用户可以根据需要添加尽可能多的翻译。

此外,他没有被迫翻译每个语言环境中的内容(如I18n.available_locales)。我喜欢那样。你怎么能解决这种情况呢?

模型(缩短):

class Project < ActiveRecord::Base
    has_many :project_translations, :dependent => :destroy, :inverse_of => :project
    accepts_nested_attributes_for :project_translations, :allow_destroy => true

class ProjectTranslation < ActiveRecord::Base
    belongs_to :project

2 个答案:

答案 0 :(得分:0)

我最终使用Active Adminactiveadmin-globalize3代替。更容易。

答案 1 :(得分:0)

它也让我烦恼,所以我创建了不允许它的自定义字段类型。

主要班级:

module RailsAdmin
  module Config
    module Fields
      module Types
        class GlobalizeTabs < RailsAdmin::Config::Fields::Association
          RailsAdmin::Config::Fields::Types::register(:globalize_tabs, self)

          register_instance_option :partial do
            :form_globalize_tabs
          end

          def method_name
            "#{super}_attributes".to_sym
          end

          # Reader for validation errors of the bound object
          def errors
            bindings[:object].errors[name]
          end

          def available_locales
            I18n.available_locales
          end
          def current_locale
            I18n.locale
          end

          # Returns array of Translation objects
          # It gets existing or creates new empty translation for every locale
          # It's used in fields_for method in partial
          def translations
            translated_locales = @bindings[:object].translated_locales
            available_locales.collect do |locale|
              translated_locales.include?(locale) ? @bindings[:object].translation_for(locale) : @bindings[:object].translations.new({ locale: locale })
            end
          end
        end
      end
    end
  end
end

它继承自RailsAdmin::Config::Fields::Association类,因为它使用非常类似于_form_nested_many部分(在has_many类型中使用)。

部分:

.controls
  = form.errors_for(field)
  %ul.nav.nav-tabs{ :style => 'margin-top:5px' }
    - field.available_locales.each do |locale|
      %li{ class: ( 'active' if locale == field.current_locale ) }
        %a{ href: "##{locale}", data: { toggle: "tab" } }= locale
.tab-content
  = form.fields_for field.name, field.translations, wrapper: false do |nested_form|
    .fields.tab-pane{ id: nested_form.object.locale, class: ( 'active' if nested_form.object.locale == field.current_locale ) }
      = nested_form.generate({:action => :nested, :model_config => field.associated_model_config, :nested_in => field.name })
= form.help_for(field)

它使用自定义字段类中的field.translations方法,该方法返回一个Translation对象数组。 每个Translation对象都对应于可用的语言环境,它是数据库中的现有对象(如果已存在翻译)或新的空翻译对象。

<强> E.g。

你有这个可用的语言环境:

I18n.available_locales = [:en, :cz, :ru]

您有 Page 模型,其中包含一些已翻译的字段。

此外,您有一个类Page(数据库中的一行)的对象,该对象的翻译为:en和:cz locales,但缺少一个用于:ru。

因此,field.translations部分内的_form_globalize_tabs方法返回一个包含以下内容的数组: 2现有翻译:en和:cz和1刚刚初始化翻译:ru。

在部分我将这个数组传递给来自fields_for gem的nested_form辅助方法,它为每个转换对象返回3个字段集。

如果您不想自己弄乱代码,可以使用此gem:https://github.com/scarfaceDeb/rails_admin_globalize_field