Интернационализация Rails (I18n) в проверках моделей: возможна или нет?

У меня есть следующая проверка в модели:

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

Похоже, что перевод не работает в производственном режиме: на всех языках всегда отображается английский перевод (вероятно, потому, что я установил английский в качестве языкового стандарта по умолчанию в моем приложении ...?).

Поэтому я предполагаю, что мы не можем переводить проверки в моделях, потому что модели загружаются только один раз - при загрузке сервера (а затем будет применен языковой стандарт по умолчанию).

Я прав? Если да, то как бы вы решили эту проблему?

Спасибо за вашу помощь!


person TomDogg    schedule 15.12.2010    source источник


Ответы (3)


Решение состоит в том, чтобы НЕ включать в модели какие-либо настраиваемые ключи сообщений, например ...

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

Затем модель применит ключи сообщений по умолчанию, например «: включение» в случае «validates_inclusion_of».

... а в config / locales / en.yml вам необходимо иметь:

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

для справки ознакомьтесь с соответствующим руководством по Rails:

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

person TomDogg    schedule 15.12.2010
comment
Я всегда забываю значения по умолчанию для сообщений об ошибках activerecord (и они мне нужны каждые несколько месяцев или около того), к счастью, Google снова и снова помогает мне находить этот ответ! - person Justus Romijn; 14.06.2012
comment
= ›Лучший способ решить эту проблему - ответить @iain ниже. - person Chris Hough; 03.11.2014
comment
Это не касается почему OPs не сработало: перевод был интерпретирован, когда проект инициализирован, что происходит при каждом запросе в dev, но только один раз при загрузке в prod . Для поддержки нескольких языков они должны интерпретироваться в runtime, к которой обращается решение @iain. Решение TomDogg работает только в том случае, если вы можете использовать один и тот же перевод по умолчанию в каждом случае, что не всегда является лучшим UX. - person Woahdae; 31.10.2015
comment
Для сообщений об ошибках, это лучшая ссылка - person niborg; 15.01.2020

Вы можете использовать символы, чтобы указать перевод:

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

И он будет переведен с определенным объемом. Дополнительные сведения см. В руководстве по I18n.

person iain    schedule 15.12.2010
comment
Следующая часть: message = ›должна быть чем-то вроде: I18n.t ('activerecord.errors.models. [Model_name] .attributes. [Attribute_name]') - person TomDogg; 15.12.2010
comment
Нет, это не работает. Я подозреваю, что в Rails невозможно иметь переводы в моделях (поскольку они загружаются только один раз). - person TomDogg; 15.12.2010
comment
Используйте символ, как это сделал я, и поместите перевод в соответствующее место (как указано в руководстве). Не звоните здесь I18n.t. Мой пример верен. - person iain; 15.12.2010
comment
Я забыл упомянуть: я использую Rails 2.3. Я полагаю, ваше решение работает для Rails 3, но не для Rails 2.3? - person TomDogg; 16.12.2010
comment
Он работает на Rails 2.2 и новее, и я знаю это наверняка, потому что внес свой вклад в эту часть. - person iain; 16.12.2010
comment
Спасибо, что вернулся - это странно. Когда я делаю то, что вы говорите, я все еще получаю неопределенный метод `select_whatever 'для модели ..., что наводит меня на мысль, что Rails не принимает символ в этом месте ... - person TomDogg; 16.12.2010
comment
что, если мне нужно отправить переменную в строку i18n. например значение% {value} недействительно? - person MegaTux; 12.08.2015

Хорошо, iain ответ работает, но мне потребовалось очень много времени, чтобы понять, куда я должен положить :select_whatever.

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

Хорошо, ваш en.yml должен выглядеть так:

en:
  errors:
    messages:
      select_whatever: "error!!"
person Sam YC    schedule 09.02.2017