icon 《基础 Ruby on Rails》的示例程序asagao与Rails2.2相适应

错误信息的国际化(1)

上一章中,实现了示例应用程序 asagao 的Member 模型各个字段名的国际化。

这一章,就其他模型的字段名国际化之后,着手实现 错误信息的国际化


按以下步骤进行操作。

  1. 参考对 app/models 目录下全部模型类的源代码(除去 member.rb )的常量REAL_ATTRIBUTE_NAMES 的描述,在 config/locales/activerecord_en.yml 以及config/locales/activerecord_ja.yml 写上各字段名的翻译。
  2. 从上述模型类的源代码删除常量 REAL_ATTRIBUTE_NAMES 和类方法 real_attribute_name 的定义。
  3. 执行ruby script/humanize.rb (无参数)。
  4. app/views 目录下的全部文件中,将.human_attribute_name(attr.to_sym)这个描述,变为.human_attribute_name(attr) (删除 .to_sym )。
  5. 执行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.ymlconfig/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)