class GettextSimpleRails::Translators::ActiveRecordValidationsTranslator

Public Instance Methods

detected?() click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 2
def detected?
  ::Kernel.const_defined?("ActiveRecord")
end
translations() click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 6
def translations
  @translations_hash = {
    "activerecord" => {
      "errors" => {
        "messages" => {
          "record_invalid" => "Invalid record: %{errors}"
        },
        "models" => {}
      }
    }
  }

  scan_validation_errors
  scan_relation_errors

  return @translations_hash
end

Private Instance Methods

scan_relation_errors() click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 49
def scan_relation_errors
  GettextSimpleRails::ModelInspector.model_classes do |inspector|
    clazz_snake_name = StringCases.camel_to_snake(inspector.clazz.name)
    @translations_hash["activerecord"]["errors"]["models"][clazz_snake_name] = {"attributes" => {}} unless @translations_hash["activerecord"]["errors"]["models"].key?(clazz_snake_name)
    attributes_hash = @translations_hash["activerecord"]["errors"]["models"][clazz_snake_name]["attributes"]
    base_hash = attributes_hash["base"] ||= {}

    inspector.relationships do |name, reflection|
      if reflection.options[:dependent] == :restrict_with_error || reflection.options[:dependent] == :restrict_with_exception
        base_hash["restrict_dependent_destroy"] ||= {}

        if reflection.macro == :has_many
          base_hash["restrict_dependent_destroy"]["many"] ||= "Cannot delete record because dependent %{record} exist"
        elsif reflection.macro == :has_one
          base_hash["restrict_dependent_destroy"]["one"] ||= "Cannot delete record because a dependent %{record} exists"
        end
      end
    end
  end
end
scan_validation_errors() click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 26
def scan_validation_errors
  GettextSimpleRails::ModelInspector.model_classes do |inspector|
    clazz_snake_name = StringCases.camel_to_snake(inspector.clazz.name)
    @translations_hash["activerecord"]["errors"]["models"][clazz_snake_name] = {"attributes" => {}} unless @translations_hash["activerecord"]["errors"]["models"].key?(clazz_snake_name)
    attributes_hash = @translations_hash["activerecord"]["errors"]["models"][clazz_snake_name]["attributes"]

    inspector.clazz._validators.each do |attribute_name, validators|
      attribute_name = attribute_name.to_s

      validators.each do |validator|
        attributes_hash[attribute_name] = {} unless attributes_hash.key?(attribute_name)
        attribute_hash = attributes_hash[attribute_name]

        translations_for_length_validator(validator, attribute_hash) if validator.is_a?(ActiveModel::Validations::LengthValidator)
        translations_for_format_validator(validator, attribute_hash) if validator.is_a?(ActiveModel::Validations::FormatValidator)
        translations_for_uniqueness_validator(validator, attribute_hash) if validator.is_a?(ActiveRecord::Validations::UniquenessValidator)
        translations_for_presence_validator(validator, attribute_hash) if validator.is_a?(ActiveRecord::Validations::PresenceValidator)
        translations_for_email_validator(validator, attribute_hash) if validator.class.name == "EmailValidator"
      end
    end
  end
end
translations_for_email_validator(validator, attribute_hash) click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 96
def translations_for_email_validator(validator, attribute_hash)
  attribute_hash["invalid"] = "is invalid"
end
translations_for_format_validator(validator, attribute_hash) click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 84
def translations_for_format_validator(validator, attribute_hash)
  attribute_hash["invalid"] = "is invalid"
end
translations_for_length_validator(validator, attribute_hash) click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 70
def translations_for_length_validator(validator, attribute_hash)
  if validator.options[:minimum].present?
    attribute_hash["too_short"] = "is too short. The minimum is %{count}"
  end

  if validator.options[:maximum].present?
    attribute_hash["too_long"] = "is too long. The maximum is %{count}"
  end

  if validator.options[:is].present?
    attribute_hash["wrong_length"] = "is not the correct length: %{count}"
  end
end
translations_for_presence_validator(validator, attribute_hash) click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 92
def translations_for_presence_validator(validator, attribute_hash)
  attribute_hash["blank"] = "cannot be blank"
end
translations_for_uniqueness_validator(validator, attribute_hash) click to toggle source
# File lib/gettext_simple_rails/translators/active_record_validations_translator.rb, line 88
def translations_for_uniqueness_validator(validator, attribute_hash)
  attribute_hash["taken"] = "has already been taken"
end