35

Ho la seguente convalida in un modello:Internazionalizzazione rotaie (I18n) nelle convalide del modello: possibile o no?

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

Sembra che la traduzione non funziona in modalità di produzione: in tutte le lingue è sempre la traduzione in inglese che viene diplayed (probabilmente perché ho impostato l'inglese come predefinita locale nella mia app ...?).

Quindi presumo che non possiamo tradurre le convalide nei modelli, perché i modelli vengono caricati solo una volta - quando il server viene avviato (e quindi, verrà applicata la locale predefinita).

Ho ragione? Se sì, come risolveresti questo problema?

Grazie per il vostro aiuto!

risposta

44

La soluzione è quella di non includere alcuna tasti personalizzati dei messaggi nei modelli, come ...

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

Il modello sarà quindi applicare le chiavi dei messaggi di default, ad esempio ": inclusione" nel caso di "validates_inclusion_of"

... e in config/locali/en.yml è necessario disporre di:

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

per riferimento, controlla la ri spettive guide:

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

+0

Ho sempre dimenticato i valori predefiniti per i messaggi di errore di activerecord (e ne ho bisogno ogni pochi mesi circa), per fortuna Google mi aiuta a trovare questa risposta più e più volte! –

+0

=> Il modo migliore per affrontare questo problema è la risposta di @iain qui sotto. –

+1

Questo non risolve * perché la soluzione * OP non ha funzionato: la traduzione è stata interpretata quando il progetto _initialized_, che avviene ogni richiesta in dev, ma solo una volta all'avvio in prod. Per supportare più lingue devono essere interpretati in _runtime_, che la soluzione di @ iain affronta. La soluzione di TomDogg funziona solo se è possibile utilizzare la stessa traduzione predefinita in ogni caso, che non è sempre la migliore UX. – Woahdae

16

È possibile utilizzare i simboli, per specificare traduzioni:

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

e sarà tradotto con un particolare ambito. Vedi lo I18n guide per maggiori dettagli.

+0

La parte seguente ": messaggio =>" dovrebbe essere qualcosa sulla falsariga di: I18n.t ('activerecord.errors.models . [model_name] .attributes. [attribute_name] ') – TomDogg

+0

No, questo non funziona. Sospetto che in Rails non sia possibile avere traduzioni nei modelli (dato che vengono caricati solo una volta). – TomDogg

+4

Utilizzare un simbolo come ho fatto e posizionare la traduzione nella posizione appropriata (come indicato nella guida). Non chiamare I18n.t qui. Il mio esempio è giusto. – iain

1

OK, iain risposta opere, ma ho preso molto tempo per capire dove devo mettere il :select_whatever.

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

Ok en.yml dovrebbe essere simile a questo:

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