如何翻译(I18N)模型中验证引发的错误文本(Ruby On Rails)

时间:2012-03-04 11:09:54

标签: ruby-on-rails

我在Ruby On Rails(3.1)上运行应用程序,需要处理各种语言的翻译。我使用I18N功能正确处理了我的控制器文本,但是模型中的验证如何,尤其是那些:

validate :valid_quantities?

def valid_quantities?
    if self.quantity*self.unitprice < 1.00
    errors.add("The transaction value", "is < 1.00")
    return false
end

我如何编码以提供对其他语言的支持?
另外,如何处理数字的格式?我无法调用ActionView助手和用户,例如number_to_currency

4 个答案:

答案 0 :(得分:9)

我会用这个:

total_price = self.quantity*self.unitprice
errors.add(:transaction_value, :transaction_undervalued, { value: total_price })

恕我直言,你最好使用像:transaction_undervalued这样的简单关键字,这样我就会根据rails guides - i18n - error message scopes查看几个名称空间:

activerecord.errors.models.[model_name].attributes.transaction_undervalued
activerecord.errors.models.[model_name]
activerecord.errors.messages
errors.attributes.transaction_undervalued
errors.messages

*替换[model_name]并且模型正在使用此验证

对于locales部分,这是/config/locales/en.yml

中的示例
en:
  errors: &errors
    messages:
      transaction_undervalued: "The transaction value is %{value}. That is < 1.00"

答案 1 :(得分:3)

有关标准验证,请参阅http://guides.rubyonrails.org/i18n.html#error-message-scopes。对于您的自定义验证,为什么不使用I18n.t?

errors.add(:transaction_value, I18n.t("errors.attributes.transaction_value.below_1"))

答案 2 :(得分:1)

好的,我取得了部分进展,看起来如下作品:

将模型验证中的代码更改为

errors.add(" ",I18n.t(:valid_quantities,:amount=>1.00))

输入de.yml的翻译

de:
    valid_quantities: "Der Mindestwert einer Order ist %{amount}"

但我仍在寻找一种正确格式化数字的方法(英语为1.00,德语为1,00)。

答案 3 :(得分:1)

您需要使用方法I18n.l来定位数字和日期。

Rails指南有一些关于错误本地化的附加信息,您应该能够将翻译直接添加到翻译文件中:http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models