Rails 2.3.4 と I18n

2009/08/15

Lighthouse の 2.3.4 milestone によれば、Rails 2.3.4 は今月末(2009年8月31日)のリリース予定だそうです。

で、私にとって嬉しいのが、Ticket #745 への対応が、Rails 2.3.4 に入ったことです。まだ open の状態だけど、パッチはもうできあがっているし、確実にコミットされるはず。

このチケットは、Rails 2.2.2 で導入された国際化(I18n)モジュールのちょっとした不足を補うものです。

config/locals/ja.yml で次のように書いたとします。

ja:
  activerecord:
    attributes:
      user:
        name: 名前
        phone: 電話番号

すると ERB テンプレートでフォームをこんな風に書きたいですよね。

<% form_for @user do |f| %>
  <%= f.label :name %>: <%= f.text_field :name %><br />
  <%= f.label :phone %>: <%= f.text_field :phone %><br />
  <%= f.submit %>
<% end %>

でも、これまでは label メソッドが I18n に対応していなかったので、f.label :name は「Name」という文字列を返すだけでした。

「名前」を返すのが自然なのに。

Rails 2.3.3 までの実装では、label メソッドはカラム名を humanize メソッドで変換しているだけ。国際化とは無関係なのです。

だから、次のように書かなくてはなりませんでした。

<% I18n.with_options :scope => [:activerecord, :attributes, :user] do |locale| %>
<% form_for @user do |f| %>
  <%= f.label :name, local.t(:name) %>: <%= f.text_field :name %><br />
  <%= f.label :phone, local.t(:phone) %>: <%= f.text_field :phone %><br />
  <%= f.submit %>
<% end %>
<% end %>

Rails 2.3.4 の登場で、かなり記述量が減りますね。

欲を言えば、submit メソッドが作るボタンの文字列も、翻訳ファイルで指定できるといいのにね。

P.S. 残念ながら Rails 2.3.4 には取り込まれませんでした。マイルストーンが 2.3.5 に変更されています。