web-dev-qa-db-fra.com

Rails internationalisation (I18N) dans les validations de modèle: possible ou non?

J'ai la validation suivante dans un modèle:

validates_inclusion_of :whatever, :in => [true, false], :message => I18n.t('please_select_whatever')

Il semble que la traduction ne fonctionne pas en mode de production: dans toutes les langues, c'est toujours la traduction anglaise qui est diplômée (probablement parce que je définis l'anglais comme paramètre local par défaut de mon application ...?).

Je suppose donc que nous ne pouvons pas traduire les validations dans les modèles, car les modèles sont chargés une seule fois - lorsque le serveur est démarré (et ensuite, les paramètres régionaux par défaut seraient appliqués).

Ai-je raison? Si oui, comment résoudriez-vous ce problème?

Merci pour ton aide!

38
TomDogg

La solution consiste à n'inclure aucun personnalisé des touches de message dans les modèles, comme ...

:message => I18n.t('activerecord.errors.models.my_model.attributes.whatever.please_select_whatever')

Le modèle appliquera ensuite les touches de message par défaut, par exemple ": inclusion" dans le cas de "validateate_inclusion_of"

... et dans config/local/fr.yml vous devez avoir:

en:
  activerecord:
    errors:
      models:
        my_model:
          attributes:
            whatever:
              inclusion: "Please select whatever." # see default key: "inclusion"

pour référence, consultez le fichier correspondant Rails Guide:

http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

49
TomDogg

Vous pouvez utiliser des symboles, pour spécifier les traductions:

validates_inclusion_of :whatever, :in => [true, false], :message => :select_whatever

Et il sera traduit d'une portée particulière. Voir le Guide I18N pour plus de détails.

17
iain

OK, iain _ Réponse fonctionne, mais j'ai pris très longtemps de temps pour comprendre où devrais-je mettre le :select_whatever.

validates_inclusion_of :whatever, :in => [true, false], :message => :select_whatever

Ok votre en.yml devrait ressembler à ceci:

en:
  errors:
    messages:
      select_whatever: "error!!"
3
GMsoF