35

tengo el siguiente validación de un modelo:Internacionalización de rieles (I18n) en validaciones de modelo: posible o no?

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

Parece que la traducción no funciona en el modo de producción: en todos los idiomas que siempre es la traducción en Inglés que consigue diplayed (probablemente porque me puse Inglés como predeterminado configuración regional en mi aplicación ...?).

Supongo que no podemos traducir las validaciones en los modelos, ya que los modelos se cargan solo una vez, cuando se inicia el servidor (y luego se aplica la configuración regional predeterminada).

¿Estoy en lo cierto? Si es así, ¿cómo resolverías este problema?

Gracias por su ayuda!

Respuesta

44

La solución es no incluye ninguna teclas personalizadas de mensajes en los modelos, al igual que ...

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

El modelo será luego aplicar las claves de mensaje predeterminado, por ejemplo ": la inclusión" en el caso de "validates_inclusion_of"

... y en config/locales/en.yml es necesario tener:

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

para referencia, echa un vistazo a la re Rieles respectivas guías:

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

+0

Siempre olvido los valores predeterminados para los mensajes de error activerecord (y los necesito cada pocos meses más o menos), afortunadamente Google me ayuda a encontrar esta respuesta una y otra vez. –

+0

=> La mejor manera de abordar este problema es la respuesta de @iain a continuación. –

+1

Esto no soluciona la solución OP * * why * no funcionó: la traducción se interpretó cuando el proyecto _initialized_, que sucede a cada solicitud en dev, pero solo una vez en el arranque en prod. Para admitir varios idiomas, deben interpretarse en _runtime_, que es la solución de @iain. La solución de TomDogg solo funciona si puede usar la misma traducción predeterminada en cada caso, que no siempre es el mejor UX. – Woahdae

16

Puede utilizar símbolos, para especificar traducciones:

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

y será traducido con un ámbito particular. Vea el I18n guide para más detalles.

+0

La parte siguiente ": mensaje =>" debe ser algo en la línea de: I18n.t ('activerecord.errors.models . [model_name] .attributes. [attribute_name] ') – TomDogg

+0

No, esto no funciona. Sospecho que en Rails, no es posible tener traducciones en los modelos (ya que solo se cargan una vez). – TomDogg

+4

Use un Símbolo como lo hice y coloque la traducción en el lugar apropiado (como se indica en la guía). No llame a I18n.t aquí. Mi ejemplo es correcto – iain

1

OK, iain obras respuesta, pero me tomó mucho tiempo para averiguar dónde debería poner el :select_whatever.

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

bien sus en.yml debería tener este aspecto:

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