《基础 Ruby on Rails》的示例程序asagao与Rails2.2相适应
错误信息的国际化(1)
上一章中,实现了示例应用程序 asagao 的Member 模型各个字段名的国际化。
这一章,就其他模型的字段名国际化之后,着手实现 错误信息的国际化。
按以下步骤进行操作。
- 参考对
app/models目录下全部模型类的源代码(除去member.rb)的常量REAL_ATTRIBUTE_NAMES的描述,在config/locales/activerecord_en.yml以及config/locales/activerecord_ja.yml写上各字段名的翻译。 - 从上述模型类的源代码删除常量
REAL_ATTRIBUTE_NAMES和类方法real_attribute_name的定义。 - 执行
ruby script/humanize.rb(无参数)。 - 在
app/views目录下的全部文件中,将.human_attribute_name(attr.to_sym)这个描述,变为.human_attribute_name(attr)(删除.to_sym)。 - 执行
rake test:functionals,确认没有失败。
因为存在不使用 real_attribute_name 方法,而直接写入 HTML 模板的字段,所以不是全部应用程序都被国际化,但是这是按照Rails 2.2的写法。
接下来是错误信息的国际化。
在《基础 Ruby on Rails》的原始源代码里,错误信息直接被写入了模型类中。
例如 member.rb 中有如下描述。
validates_presence_of :member_number,
:family_name, :given_name, :furigana, :login_name,
:message => '未写入。'
validates_length_of :family_name, :given_name, :furigana,
:email, :phone, :login_name,
:maximum => 60,
:message => '60字以内写入。'
Rails 2.2 中应该怎样记述呢。
首先,参照 http://rails-i18n.org/wiki/pages/translations-available-in-rails ,将 “ActiveRecord”部分的代码复制到 config/activerecord_en.yml 和 config/activerecord_ja.yml 的末尾。但是,要省去最初的 en-US: 和 activerecord: 的行。
接下来,将 config/activerecord_ja.yml 的各行翻译成汉字。
(省略)
errors:
messages:
inclusion: "列表中没有。"
exclusion: "预约中。"
invalid: "无效值。"
confirmation: "不匹配。"
accepted: "接受。"
empty: "未填写。"
blank: "未填写。"
too_long: "以{{count}}字以内输入。"
too_short: "以{{count}}字以上输入。"
wrong_length: "以{{count}}文字输入。"
taken: "已被使用。"
not_a_number: "输入数值。"
greater_than: "指定大于{{count}}的值。"
greater_than_or_equal_to: "指定{{count}}以上的值。"
equal_to: "指定{{count}}"
less_than: "指定小于{{count}}的值"
less_than_or_equal_to: "指定{{count}}以下的值。"
odd: "指定奇数。"
even: "指定偶数。"
# Append your own errors here or at the model/attributes scope.
models:
# Overrides default messages
attributes:
# Overrides model and default messages.
这些在所有的模型中作为共通的错误信息被使用。
blank 等的关键字,对应验证方法。
例如,validates_presence_of 失败时的默认信息是 t('activerecords.errors.messages.blank') 。
信息中 {{count}} 等的描述,表示嵌入了其他的值。
这样的话,先前的 member.rb ,可以像下面这样变得流畅。
validates_presence_of :member_number,
:family_name, :given_name, :furigana, :login_name
validates_length_of :family_name, :given_name, :furigana,
:email, :phone, :login_name,
:maximum => 60
像这样,通过 Rails2.2 ,我们把应用程序的逻辑(逻辑)和演示文稿(外观)更明确的分离开来。
能够分离演示文稿的话,便很容易将程序中的所有表现统一起来。这就避免有的时候显示的是“未填写”,有的时候显示的又是“请填写”。
今天就到这吧。下回,说明用按模型按字段改变错误信息的方法。
(2009/01/09)
- 前言
- 功能测试开头部分的修改等 (2008/12/01)
- rake rails:update (2008/12/15)
- Cookie Store (2008/12/16)
- 分页 (2008/12/17)
- blog_entries 控制台的修改 (2008/12/20)
- 单例资源 (2008/12/21)
- 一口气通过所有功能测试 (2008/12/21)
- 综合测试和rak (2008/12/22)
- 国际化(i18n)的第一步 (2008/12/26)
- 基于Cookie的区域的切换 (2009/01/04)
- ActiveRecord 模型的字段名的国际化 (2009/01/08)
- 错误信息的国际化(1) (2009/01/09)
- 错误信息的国际化(2) (2009/01/10)
- 错误信息的国际化(3) (2009/01/17)
- 错误信息的国际化(4) (2009/01/24)

