第17回: Devise によるユーザー認証機能の日本語化(3)
2010/10/16
冒頭でちょっとお詫びをしなければなりません。前々回の記事で、デフォルトロケールを日本語(ja)に変更しました。その結果、Nchakにログインして、トップページ(タスクの一覧)を表示すると次のようなエラー画面が表示されてしまうのです。
エラーメッセージには次のように表示されています。
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.label
か form.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: 期限
この結果、タスク一覧ページは次のような表示に変わります。
エラーメッセージの日本語化
では、本題に戻りましょう。
今回は、Devise によるユーザー認証機能の日本語化(3)ということで、エラーメッセージの日本語化を行います。
Nchak からログアウトして、「ユーザー登録」リンクをクリックし、何も入力しないで「Sign up」ボタンをクリックします。すると、次のようなエラーメッセージが表示されます。
これを直していきましょう。
Rails が依存している i18n パッケージは、ドイツ人のズヴェン・フックス(Sven Fuchs)さんという方がメインで作っているのですが、彼の github プロジェクトのひとつ svenfuchs/rails-i18n に行くと、各国の翻訳ファイル(ロケールファイル)が集められています。
ここを起点にして、rails/locales とたどると、ar.yml
以下ずらりと翻訳ファイルが並んでいます。このうちの ja.yml
を開き、右上の「raw」リンクをクリックして、ja.yml
をダウンロードし、config/localse
ディレクトリに保存してください。
この作業の結果、エラーメッセージは次のように改善されます。
まだ、翻訳されない部分が残っていますし、よく見ると「メールアドレス」と「を入力してください。」の間に隙間が空いています。
この点は次回以降で直すことにしましょう。