第17回: Devise によるユーザー認証機能の日本語化(3)

2010/10/16

冒頭でちょっとお詫びをしなければなりません。前々回の記事で、デフォルトロケールを日本語(ja)に変更しました。その結果、Nchakにログインして、トップページ(タスクの一覧)を表示すると次のようなエラー画面が表示されてしまうのです。

画面キャプチャ1

エラーメッセージには次のように表示されています。

can't convert Symbol into String

せっかくなので、こういう訳の分からないエラーに出会った時にどう対処するか、少し詳しく書いてみたいと思います。

エラー画面をよく読むと、app/views/tasks/index.html.erb の4行目で例外が発生していることがわかります。

Showing /home/kuroda/work/nchak/app/views/tasks/index.html.erb where line #4 raised:

と書いてありますよね。

で、エラーメッセージの下にソースコードの抜粋が出ています。

1: <%= form_for @task do |form| %>
2: <ul>
3:   <li><%= form.label :name %><%= form.text_field :name %></li>
4:   <li><%= form.label :due_date %><%= form.date_select :due_date %></li>
5:   <li><%= form.submit %></li>
6: </ul>
7: <% end %>

form.labelform.date_select が原因なのですが、label メソッドは3行目にもありますから、date_select メソッドがあやしいですね。デフォルトロケールを変更するまでは動いていたのですから、Rails 自体のバグかもしれません。

このような時には、もちろん Google 先生に聞いてみます(いつも答えてくれるわけではありませんが)。

「can't convert Symbol into String rails date_select」で検索すると、ビンゴです。最初の http://i18n.lighthouseapp.com/projects/14947/tickets/12-i18n-and-date_select-exception に解決法が載っていました。

未知のエラーに遭遇すると、いつも私はこのように調べています。エラーメッセージ全体に "rails" という単語と関連しそうな語句(ここでは "date_select")を加えて検索すると、見つかりやすいです。残念ながら、たいていは英語の記事がヒットして、そこに正解が書かれています。Rails を広めたい私としては「Rails プログラミングには英語が必須」とまでは言いたくないのですが、英語が苦手だとかなり不利であることは否定できません。

要するに、config/locales/ja.yml というファイル(存在しなければ作る)に、次のような記述を追加せよ、ということです。

ja:
  date:
    order: [ :year, :month, :day ]

これでアプリケーションを再起動すると、エラーは出なくなります。

ただし、日付選択の月表示が変になります。完全に直すには、この記事の後半の指示に従い github の svenfuchs/rails-i18n から ja.yml をダウンロードして config/locales に置いてください。

宿題の答え合わせ

さて、前回の最後に出した宿題は、やりましたか?

答えは、次の通りです。

config/locales/attributes.yml を次のように修正します。

ja:
  activerecord:
    attributes:
      user:
        email: メールアドレス
        password: パスワード
        password_confirmation: パスワード(再入力)
        remember_me: 次回からパスワード入力を省く
      task:
        name: 名称
        due_date: 期限

この結果、タスク一覧ページは次のような表示に変わります。

画面キャプチャ2

エラーメッセージの日本語化

では、本題に戻りましょう。

今回は、Devise によるユーザー認証機能の日本語化(3)ということで、エラーメッセージの日本語化を行います。

Nchak からログアウトして、「ユーザー登録」リンクをクリックし、何も入力しないで「Sign up」ボタンをクリックします。すると、次のようなエラーメッセージが表示されます。

画面キャプチャ3

これを直していきましょう。

Rails が依存している i18n パッケージは、ドイツ人のズヴェン・フックス(Sven Fuchs)さんという方がメインで作っているのですが、彼の github プロジェクトのひとつ svenfuchs/rails-i18n に行くと、各国の翻訳ファイル(ロケールファイル)が集められています。

ここを起点にして、rails/locales とたどると、ar.yml 以下ずらりと翻訳ファイルが並んでいます。このうちの ja.yml を開き、右上の「raw」リンクをクリックして、ja.yml をダウンロードし、config/localse ディレクトリに保存してください。

この作業の結果、エラーメッセージは次のように改善されます。

画面キャプチャ4

まだ、翻訳されない部分が残っていますし、よく見ると「メールアドレス」と「を入力してください。」の間に隙間が空いています。

この点は次回以降で直すことにしましょう。