35

Ich habe folgende Validierung in einem Modell:Schienen Internationalisierung (I18n) in Modellvalidierungen: Möglich oder nicht?

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

Es scheint, dass die Übersetzung nicht im Produktionsmodus funktioniert: in allen Sprachen ist es immer die Englisch-Übersetzung, die (wahrscheinlich diplayed wird, weil ich als Standard-Englisch eingestellt Locale in meiner App ...?).

Also ich nehme an, dass wir Validierungen in Modellen nicht übersetzen können, weil Modelle nur einmal geladen werden - wenn der Server gestartet wird (und dann das Standardgebietsschema angewendet wird).

Bin ich richtig? Wenn ja, wie würden Sie dieses Problem lösen?

Danke für Ihre Hilfe!

Antwort

44

Die Lösung enthalten ist KEINE benutzerdefinierten Nachrichtenschlüssel in den Modellen, wie ...

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

Das Modell wird die Standardnachrichtenschlüssel dann gelten, zum Beispiel „: Inklusion“ in dem Fall von "validates_inclusion_of"

... und in config/locales/en.yml müssen Sie haben:

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

als Referenz, die erneute Besuche hängig Rails Führung:

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

+0

Ich vergesse immer die Standardeinstellungen für die ActiveRecord Fehlermeldungen (und ich brauche sie alle paar Monate oder so), glücklicherweise hilft Google mir, diese Antwort immer wieder zu finden! –

+0

=> Der beste Weg, dieses Problem anzugehen, ist die Antwort von @iain unten. –

+1

Dies adressiert nicht * warum * OPs Lösung hat nicht funktioniert: Die Übersetzung wurde interpretiert, wenn das Projekt _initialized_, die jede Anfrage in Dev passiert, aber nur einmal beim Start in prod. Um mehrere Sprachen zu unterstützen, müssen sie nach _runtime_ interpretiert werden, was die @ iain-Lösung adressiert. TomDoggs Lösung funktioniert nur, wenn Sie in jedem Fall die gleiche Standardübersetzung verwenden können, was nicht immer die beste UX ist. – Woahdae

16

können Sie Symbole verwenden, Übersetzungen angeben:

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

Und es wird mit einem bestimmten Umfang umgesetzt werden. Weitere Informationen finden Sie unter I18n guide.

+0

Der Teil folgende ": message =>" sollte etwas entlang der Linien der folgenden sein: I18n.t ('activerecord.errors.models . [model_name] .attributes. [attribute_name] ') – TomDogg

+0

Nein, das funktioniert nicht. Ich vermute, dass in Rails Übersetzungen in Modellen nicht möglich sind (da sie nur einmal geladen werden). – TomDogg

+4

Verwende ein Symbol wie ich es getan habe und lege die Übersetzung an die richtige Stelle (wie in der Anleitung angegeben). Rufe I18n.t nicht hier an. Mein Beispiel ist richtig. – iain

1

OK, iain Antwort funktioniert, aber ich habe sehr lange Zeit, um herauszufinden, wo soll ich die :select_whatever setzen.

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

OK Ihre en.yml sollte wie folgt aussehen:

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