35

Mam następujący walidacji w modeluRails Internationalization (I18n) w walidacji modelu: Możliwe czy nie?

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

Wydaje się, że tłumaczenie nie działa w trybie produkcyjnym: we wszystkich językach zawsze jest tłumaczenie na język angielski, który pobiera diplayed (prawdopodobnie dlatego, że ustawiony angielski jako domyślny locale w mojej aplikacji ...?).

Zakładam więc, że nie możemy tłumaczyć walidacji w modelach, ponieważ modele są ładowane tylko raz - po uruchomieniu serwera (a następnie zastosowane zostaną domyślne ustawienia narodowe).

Mam rację? Jeśli tak, jak rozwiązałbyś ten problem?

Dzięki za pomoc!

Odpowiedz

44

Rozwiązaniem jest nie obejmuje jakiejkolwiek klucze zwyczaj wiadomości w modelach, takich jak ...

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

Model będzie następnie zastosować klucze domyślną wiadomość, na przykład „: włączenie” w przypadku z "validates_inclusion_of"

... i w config/locales/en.yml trzeba mieć:

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

odsyłającego, sprawdź ponownie prospektywnych prowadnicami:

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

+0

Zawsze zapominam o wartościach domyślnych komunikatów o błędach activerecord (i potrzebuję ich co kilka miesięcy), na szczęście Google pomaga mi znaleźć tę odpowiedź raz za razem! –

+0

=> Lepszym sposobem rozwiązania tego problemu jest odpowiedź @iain poniżej. –

+1

To nie rozwiązuje problemu * dlaczego * Rozwiązanie OPs nie zadziałało: tłumaczenie zostało zinterpretowane, gdy projekt _initialized_, co dzieje się w każdym żądaniu w dev, ale tylko raz podczas bootowania w prod. Aby obsługiwać wiele języków, muszą one być interpretowane w _runtime_, do którego adresowane jest rozwiązanie @ iain. Rozwiązanie TomDogga działa tylko wtedy, gdy możesz użyć tego samego domyślnego tłumaczenia w każdym przypadku, co nie zawsze jest najlepszym UX. – Woahdae

16

Można używać symboli, aby określić tłumaczenia:

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

i będzie to tłumaczone z danego zakresu. Aby uzyskać więcej informacji, zobacz numer I18n guide.

+0

część po ": message =>" należy coś wzdłuż linii: I18n.t ('activerecord.errors.models . [nazwa_modelu] .attributes. [nazwa_atrybutu] ') – TomDogg

+0

Nie, to nie działa. Podejrzewam, że w Railsach nie ma możliwości tłumaczenia na modele (ponieważ są one ładowane tylko raz). – TomDogg

+4

Użyj symbolu tak jak ja i umieść tłumaczenie w odpowiednim miejscu (jak wskazano w przewodniku). Nie dzwoń tutaj na I18n.t. Mój przykład jest słuszny. – iain

1

OK, iain prace odpowiedź, ale wziąłem bardzo dużo czasu, aby dowiedzieć się, gdzie należy umieścić :select_whatever.

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

OK twoi en.yml powinna wyglądać następująco:

en: 
    errors: 
    messages: 
     select_whatever: "error!!" 
Powiązane problemy