Rails I18N: ActiveRecord对象本地化

一直以来使用 Changing human attribute labels in Rails validation messages 中介绍的方法来本地化 ActiveRecord 字段名称。该方法简单实用,比方说有这样一个 User model:

# == Schema Information
# Schema version: 20081028111521
#
# Table name: users
#
#  id                   :integer         not null, primary key
#  login                :string(255)     
#  email                :string(255)     
class User < ActiveRecord::Base
  #...
end

只要在该类中加入以下代码,就可以在 validation 的错误信息中显示中文字段名:

humanize_attributes :login => "用户名",
                    :email => "电邮"

现在 Rails 2.2 为我们带来了强大的 I18N 功能,没有必要再用上述方法来实现本地化了。首先,在 environment.rb 中指定本地化语言:

config.i18n.default_locale = :cn

然后在 config/locales 目录下新建 cn.yml 文件,并进行以下设置:

cn:
  activerecord:
    models:
      user: "用户"
    attributes:
      user:
        login:	"用户名"
        email:	"电邮"

非常优雅方便。

Error messages 也可以用同样的方法进行设置。比方说,以前会用:

validates_presence_of     :login, :message => "不能为空"

现在只要在配置文件中加入相应信息即可:

activerecord:
  errors:
    messages:
      blank:      '不能为空'

旧版本的 rails 应用中还需要用到老方法。为方便起见,弄了个 plugin,github 地址:

humanize_attributes

PS: 可以在 script/console 下检查效果:

>> User.human_attribute_name('login')
=> "用户名"
>> I18n.translate :'activerecord.attributes.user.email'
=> "电邮"