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

2010/10/15

前回に引き続き、Devise を利用して作ったユーザー認証機能を日本語化していきます。

今回の目標は、ログインフォームの各ラベルを翻訳することなのですが、3種類の方法をご紹介いたします。

(1) label メソッドに翻訳を与える

エディタで app/views/devise/sessions/new.html.erb を開いてください。4行目は次のようになっていますね。

  <p><%= f.label :email %></p>

これを、次のように修正してください。

  <p><%= f.label :email, 'メールアドレス' %></p>

元のソースコードでは、ブロック変数 flabel メソッドに引数を1つだけ与えていましたが、変更後のコードでは第2引数として「メールアドレス」という文字列を与えています。これがラベル文字列として表示されます。

ブラウザで確認してみましょう。

画面キャプチャ1

うまく行きました。

このように、直接 label メソッドに翻訳を与えることで、フォームを日本語化することができます。

(2) helpers.label スコープの翻訳ファイルを作る

第1の方法は直感的で分かりやすいのですが、実はあまりお勧めの方法ではありません。

なぜなら、同一の翻訳テキストが複数のファイルに散らばることになるからです。つまり、冗長性が増すということ。冗長性はRailsの、というかプログラミングの敵ですよね。

「email」を「メールアドレス」と翻訳して表示したいのはログインフォームだけではありません。

ユーザー登録フォームやパスワード再発行フォームでも同じように翻訳したいものです。

そこで登場するのが翻訳ファイル(ロケールファイル)です。

エディタで config/locales/helpers.ja.yml という新規ファイルを次のように作成してください。

ja:
  helpers:
    label:
      user:
        email: メールアドレス
        password: パスワード
        password_confirmation: パスワード(再入力)
        remember_me: 次回からパスワード入力を省く

インデント(字下げ)の幅に特に注意して入力してください。半角スペース2個ずつ下げています。タブ文字は使用禁止です。また、コロン(:)の後のスペース(もちろん半角!)にも注意。

これは、日本語(ja)用の helpers.label スコープの翻訳ファイルです。スコープ とは、翻訳データを構造化する仕組みで、「名前空間」のようなものと考えてください。

label メソッドは、第2引数が省略されると、モデル名とカラム名に対応する翻訳データが helpers.label スコープに定義されていないかを調べ、定義されていればそれをラベル文字列として使用します。

アプリケーションを再起動してから、ブラウザでログインフォームを再読込してみましょう。

画面キャプチャ2

おお、いい感じです。

ユーザー登録フォームはどうでしょうか。

画面キャプチャ3

完璧です!「Sign up」の部分は、まだ翻訳していないので、英語のままなのは仕方がありません。

(3) activerecord.attributes スコープの翻訳ファイルを作る

実は、label メソッドは、第2引数が省略されていて、helpers.label スコープにも対応する翻訳が見つからないとき、最後のよりどころとして、activerecord.attributes スコープに翻訳を探しに行きます。

これが第3の方法です。

エディタで config/locales/attributes.ja.yml という新規ファイルを次のように作成してください。

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

そして、config/locales/helpers.ja.yml を削除するか、1行目の ja:xa: に変更して helpers.label スコープの翻訳データを無効にします。

アプリケーションを再起動してから、ブラウザでログインフォームやユーザー登録フォームを表示してみて、ラベルがちゃんと日本語になっていることを確認してください。

実は、config/locales ディレクトリに置く翻訳ファイルのファイル名に特別な意味はありません。helpers.ja.ymlfoo.ja.yml でも bar.yml でも何でもよくて、あなた(プログラマ)にとって分かりやすいように命名してください。ただし、拡張子は yml にしてください。なお、config/locales ディレクトリの下にサブディレクトリを作ってもいいのですが、config/application.rb の中で config.i18n.load_path の設定を変更する必要があります(コメントに設定方法が書いてあります)。

3つの方法の使い分け

以上の3つの方法はどのように使い分けるべきでしょうか。

最も汎用的なのが、第3の方法です。今回は触れませんが、activerecord.attributes スコープの翻訳はエラーメッセージの日本語化においても使われます。

ですから、特別な理由がない限り、第3の方法を使うべきです。

エラーメッセージの中で使用するカラムの名前とフォームの中に表示したいカラムの名前が異なるときは、第2の方法が使えます。

そして、ある特定のページのフォームだけ特別な表記にしたい時、第1の方法(label メソッドの第2引数で指定する)を選択します。

宿題

さて、config/locales ディレクトリの翻訳ファイルによるフォームの翻訳(国際化)は、Devise に限った話ではなく、Ruby on Rails 標準のやり方です。

第7回: タスクの新規追加フォームでは、あえてフォームの日本語化は行いませんでしたが、今回学んだ知識を応用すれば、簡単に日本語化できます。演習問題として挑戦してみてくださいね。