PS: je viens de trouver (presque) vraie une solution à ce problème, tout est disponible sur ce site :
http://www.railtie.net/articles/2006/01/26/enhancing_rails_errors De ce fait, la suite de l'actuel billet est tout à fait obsolète
Le français, c'est chiant.
Rails est plein de helpers, tous utiles mais avec une belle partie destinée à un public anglophone/américain.
Aujourd'hui, je me suis attelé à faire une version française de error_messages_for, qui permet de gérer les apostrophes, féminins et les pluriels des champs, plus le pluriel du titre du formulaire, tout en gardant vos validates_* dans votre model.
Vous devez donc ajouter ceci dans vos helpers (dans app/helpers/application_helper.rb de préférence).
Cette fonction est utilisable de cette façon :
<%= error_messages_for_fr 'commande', :feminin => true, :femff => ['taille','famille'], :plurff => ['termes_du_contrat'] %>
Toutes les nouvelles options sont facultatives :
- :feminin : Si le formulaire est féminin => "Cette commande ne peut être enregistré à cause d'une erreurs"
- :femff : Feminin for fields : un array contenant tous les champs féminins ne commençant pas par une voyelle : => "La taille est est invalide"
- :plurff : Pluriel for fields : un array contenant tous les champs dont le premier mot est pluriel ne commençant pas par une voyelle : => "Les termes du contrat doi(ven)t être accepté(s)"
Alors oui, on peut faire mieux pour optimiser le bon français et éviter les parenthèses comme dans le dernier exemple, mais je ne souhaitais pas sursursurcharger la fonction plus qu'elle ne l'est déjà...
Vu que je suis relativement nouveau à ruby, le code est surement améliorable.
def error_messages_for_fr(object_name, options = {})
# gestion du <h2> à partir de
# /usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_view/helpers/active_record_helper.rb
retour = error_messages_for(object_name, options)
cecette = (options[:feminin] == true) ? 'Cette' : 'Ce'
esup = (options[:feminin] == true) ? 'e' : ''
retour.gsub!(/(\d+) (\w+) prohibited this .+ from being saved/,"#{cecette} #{object_name.humanize.downcase} ne peut être enregistré#{esup} à cause \\1 \\2")
retour.gsub!('1 error','d\'une erreur')
retour.gsub!(/(\d+) errors/,"de \\1 erreurs")
retour.gsub!('There were problems with the following fields:','Les champs suivants posent problème :')
# gestion du sous-titre à partir de
# /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb
preversion = [ "is not included in the list", "is reserved", "is invalid",
"doesn't match confirmation", "must be accepted", "can't be empty",
"can't be blank", "is too long \(maximum is (\d+) characters\)",
"is too short \(minimum is (\d+) characters\)", "is the wrong length \(should be (\d+) characters\)",
"has already been taken", "is not a number" ]
postversion = [ "n'est pas dans la liste", "est réservé(e)", "est invalide", "ne corresponds pas à la confirmation",
"doi(ven)t être accepté(s)", "ne peut être blanc", "ne peut être vide",
"est trop long (le maximum étant de \\1 caractères)", "est trop court (le minimum étant de \\1 caractères)",
"est de taille incorrecte (devrait être de \\1 caractères", "est déjà pris", "n'est pas un nombre" ]
preversion.each_index {|w|
retour.gsub!(/#{preversion[w]}/, postversion[w])
}
retour.gsub!("<li>","\n<li>")
@options = options
def feminiser(str, ret = nil)
@options[:femff].each {|x|
ret = str.gsub(/<li>#{x.humanize}/i, "<li>La #{x.humanize.downcase}")
} if @options[:femff]
ret
end
def plurieliser(str, ret = nil)
@options[:plurff].each {|x|
ret = str.gsub(/<li>#{x.humanize}/i, "<li>Les #{x.humanize.downcase}")
} if @options[:plurff]
ret
end
def apostropher(str, ret = nil)
ret = str.gsub(/<li>([aeiouy]+)/i,"<li>L'\\1")
ret
end
double = retour
double.split("\n").map {|z|
y = (z.include? '<li>') ? z.downcase : z
unless y == feminiser(y) or y == plurieliser(y) or y == apostropher(y)
y.gsub!(/<li>(.+)/,"<li>Le \\1")
else
y = feminiser(y) if feminiser(y)
y = plurieliser(y) if plurieliser(y)
y = apostropher(y) if apostropher(y)
end
retour.gsub!(z,y) if y
}
retour
end