1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module Sequel
  class Model
    class Errors < ::Hash
      ATTRIBUTE_JOINER = I18n.t('errors.joiner').freeze
      def full_messages
        inject([]) do |m, kv|
          att, errors = *kv
          att.is_a?(Array) ? Array(att).map!{|v| I18n.t("attributes.#{v}")} : att = I18n.t("attributes.#{att}")
          errors.each {|e| m << (e.is_a?(LiteralString) ? e : "#{Array(att).join(ATTRIBUTE_JOINER)} #{e}")}
          m
        end
      end
    end
  end
end

Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS.merge!({
  :exact_length=>{:message=>lambda{|exact| I18n.t("errors.exact_length", :exact => exact)}},
  :format=>{:message=>lambda{|with| I18n.t("errors.format")}},
  :includes=>{:message=>lambda{|set| I18n.t("errors.include", :values => set.inspect)}},
  :integer=>{:message=>lambda{I18n.t("errors.integer")}},
  :length_range=>{:message=>lambda{|range| I18n.t("errors.length_range", :min => range.min, :max => range.max)}},
  :max_length=>{:message=>lambda{|max| I18n.t("errors.max_length", :max => max)}, :nil_message=>lambda{I18n.t("errors.presence")}},
  :min_length=>{:message=>lambda{|min| I18n.t("errors.min_length", :min => min)}},
  :not_string=>{:message=>lambda{|type| type ? I18n.t("", :type => type) : I18n.t("errors.string")}},
  :numeric=>{:message=>lambda{I18n.t("errors.numeric")}},
  :type=>{:message=>lambda{|type| I18n.t("errors.type", :type => type)}},
  :presence=>{:message=>lambda{I18n.t("errors.presence")}},
  :unique=>{:message=>lambda{I18n.t("errors.unique")}}
})

es:
  attributes:
    id: "Identificador"
    name: "Nombre"
    mail: "Mail"
  errors:
    joiner: " , "
    exact_length: "debe tener exactamente %{exact} caracteres"
    min_length: "no puede tener menos de %{min} caracteres" 
    max_length: "no puede tener más de %{max} caracteres"    
    length_range: "debe tener entre %{min} y %{max} caracateres"    
    include: "debe ser uno de los siguientes valores: %{values}"
    presence: "no puede estar en blanco"
    unique: "ya fué usado"    
    type: "debe ser de tipo %{type}"
    valid: "no es un %{type} válido"
    numeric: "deber ser un número"
    integer: "debe ser un múmero entero"    
    string: "no es una cadena de texto"