35

je la validation suivante dans un modèle:Rails Internationalisation (I18n) dans les validations de modèles: Possible ou non?

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, il est toujours la traduction anglaise qui obtient diplayed (probablement parce que je mets l'anglais comme défaut paramètres régionaux dans mon application ...?). Donc, je suppose que nous ne pouvons pas traduire les validations dans les modèles, car les modèles ne sont chargés qu'une seule fois - lorsque le serveur est démarré (et ensuite, les paramètres régionaux par défaut seront appliqués).

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

Merci pour votre aide!

Répondre

44

La solution est de ne pas inclure toutes les touches personnalisées message dans les modèles, comme ...

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

Le modèle appliquera alors les clés de message par défaut, par exemple « : inclusion » dans le cas de "validates_inclusion_of"

... et dans config/locales/en.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 la re Rails de guidage respectifs:

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

+0

J'oublie toujours les valeurs par défaut pour les messages d'erreur activerecord (et j'en ai besoin tous les quelques mois environ), heureusement Google m'aide à trouver cette réponse encore et encore! –

+0

=> La meilleure façon d'aborder ce problème est la réponse de @iain ci-dessous. –

+1

Cela n'aborde pas * pourquoi * OPs solution ne fonctionne pas: la traduction a été interprétée lorsque le projet _initialized_, qui se produit chaque demande en dev, mais seulement une fois au démarrage dans prod. Pour prendre en charge plusieurs langues, elles doivent être interprétées à _runtime_, à laquelle la solution de @ iain s'adresse. La solution de TomDogg ne fonctionne que si vous pouvez utiliser la même traduction par défaut dans tous les cas, ce qui n'est pas toujours le meilleur UX. – Woahdae

16

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

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

Et il sera traduit avec une portée particulière. Voir le I18n guide pour plus de détails.

+0

La partie suivante ": message =>" devrait être quelque chose le long des lignes de: I18n.t ('activerecord.errors.models . [nom_modèle] .attributes. [nom_attribut] ') – TomDogg

+0

Non, cela ne fonctionne pas. Je soupçonne que dans Rails, il n'est pas possible d'avoir des traductions dans les modèles (puisqu'ils ne sont chargés qu'une seule fois). – TomDogg

+4

Utilisez un symbole comme je l'ai fait et placez la traduction à l'endroit approprié (comme indiqué dans le guide). N'appelez pas I18n.t ici. Mon exemple est juste. – iain

1

OK, iain œuvres de réponse, mais je pris très longtemps pour savoir où dois-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!!"