模型验证中的Rails国际化(I18n):可能与否?

时间:2010-12-15 14:42:09

标签: ruby-on-rails validation internationalization model production-environment

我在模型中进行了以下验证:

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

似乎翻译在生产模式下不起作用:在所有语言中,它始终是英语翻译(可能因为我将英语设置为我的应用程序中的默认语言环境......?)。

所以我假设我们无法在模型中转换验证,因为模型只加载一次 - 当服务器启动时(然后,将应用默认的语言环境)。

我是对的吗?如果是的话,你会如何解决这个问题?

感谢您的帮助!

3 个答案:

答案 0 :(得分:46)

解决方案是不在模型中包含任何自定义消息密钥,例如......

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

然后,模型将应用默认消息密钥,例如“validates_inclusion_of”

中的“:includes”

...在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

答案 1 :(得分:17)

您可以使用符号来指定翻译:

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

它将在特定范围内翻译。有关详细信息,请参阅I18n guide

答案 2 :(得分:3)

好的,iain回答有效,但我花了很长时间才弄明白我应该把:select_whatever放在哪里。

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

确定您的en.yml应如下所示:

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