2011年12月27日火曜日

[Rails3] 国際化 I18n のまとめ(その1:準備編)

実行環境:
ruby 1.9.3
Rails 3.1.3
I18n
文字列を国際化する I18n の使い方のまとめです。
ここでいう国際化とは、要するに複数言語表示対応という意味です。
※ちなみに I18n というのは、I で始まり、間に18文字を挟んで、nで終わる文字列という意味で Internationalization の略称です。

「おらぁ日本語しか使わねーから関係ねえだよ」と思う方もいるかと思いますが、View 用の日本語文字列をコードと切り離しておく場合、I18n の枠組みに乗っかると便利です。

今回は、その1として I18n を使った国際化の大まかなイメージを説明しつつ、日本語ロケールを使えるように設定します。

ロケールとは使用する言語の設定であり、1つの Rails アプリケーションの中で英語(:en)、日本語(:ja)、スペイン語(:es)などなど複数のロケールを定義することができます。

表示する時点のロケール値(I18n.locale)によって表示する言語を切り替える仕組みになっています。I18.locale の値が :en なら英語表記、I18n.locale の値が :ja なら日本語表記で表示される、という具合です。
動作確認のテスト1
適当な scaffold を作って(ここでは book とします)、View の中で以下のように書いてみて下さい。
#{RAILS.ROOT}/app/views/books/index.html.erb
<%=t :hello %>
I18n が働いていれば
hello world
と表示されるはずです。
なぜこうなるかと言えば、既に #{RAILS.ROOT}/config/locales/en.yml の中で「hello: hello world」と書かれているからです。
#{RAILS.ROOT}/config/locales/en.yml
en: hello: hello world
I18n.translation というのがキーと値の対応付けをしてくれるメソッドで :hello(もしくは 'hello')を渡すと 'hello world' を返します。
t というヘルパーメソッドが、この I18n のメソッドの別名として定義されています。

en.yml は辞書ファイルと呼ばれ、このファイルの中にロケールの定義を書いていきます。
通常、ファイル名のベースネーム部分(拡張子より前の部分)はロケールを表すアルファベット2文字にします。日本語なら ja.yml、英語なら en.yml、ドイツ語なら de.yml、フランス語なら fr.yml という具合です。こうすると1つのファイルには1つのロケールについての定義を記載し、複数のロケールについて定義する場合はそれぞれのロケール名に応じたファイルを作成することになります。
※実際にはファイル名は何でもよいです。複数のロケールの定義を1つのファイルにまとめて書いてもOK。どのロケールの定義かは、ファイル名ではなくymlファイルの中身(ハッシュ定義の最上位のキー)で判断されます。どのファイルを読み込むかも「*.yml」って感じで設定されているので拡張子さえあっていればなんでもいいのです。

デフォルトロケールの設定

I18n は表示をする際にその時のロケールの値、I18n.locale の値をみて表示するロケールを判断します。 ロケール値はコードの中で明示的に変更しない限り、デフォルトの値が使用されます。 ロケールのデフォルトは通常 :en、つまり英語になっています。 そのため上記のテスト1ではロケール値が :en となり en.yml の中で設定した内容が表示されたわけです。
動作確認のテスト2
先ほどのテスト1と同じファイルで日本語ロケールのテストをしてみましょう。 まず en.yml を同じディレクトリにコピーして ja.yml という名前にし、テキストを以下のように変更します。
#{RAILS.ROOT}/config/locales/ja.yml
ja: hello: こんにちは、世界
続いて View ファイルを編集します。
#{RAILS.ROOT}/app/views/books/index.html.erb
<%= "[%s]:"%(I18n.locale.to_s) > <%=t :hello %> <br /> <% I18n.locale = :ja > <%= "[%s]:"%(I18n.locale.to_s) > <%=t :hello %>
サーバを再起動してから実行します。(辞書ファイルを更新した場合はサーバの再起動が必要です)
[en]hello world
[ja]こんにちは、世界
と表示されたでしょうか?このようにロケール値を変えることで表示する文字列を変えるわけです。

日本語をメインで使用するので日本語をデフォルトのロケールに設定したいと思います。config/application.rb を下記のように編集します。
#{RAILS.ROOT}/config/application.rb
config.i18n.default_locale = :ja
これでデフォルトのロケールが日本語(:ja)になりました。


辞書の置き場所

辞書ファイルはたいてい各ロケールごとにymlファイルを作成します。まじめに国際化をしようとすると1ファイル内に書くと定義する項目が多くなってきて見通しが悪くなりますので、1つのロケールの定義を複数のファイルに分割したりします。ディレクトリをきってロケールの分割された辞書ファイルを格納することも可能です。
#{RAISL.ROOT}/config/locales/ 以下のディレクトリ構成(例1)
[locales] |-- defaults.en.yml |-- defaults.ja.yml |-- models.ja.yml |-- models.en.yml |-- views.ja.yml |-- views.en.yml
#{RAISL.ROOT}/config/locales/ 以下のディレクトリ構成(例2)
[locales] |-- [defaults] | |-- en.yml | |-- ja.yml |-- [models] | |-- [defaults] | | |-- en.yml | | |-- ja.yml | |-- [users] | | |-- en.yml | | |-- ja.yml | |-- [books] | | |-- en.yml | | |-- ja.yml |-- [views] |-- [defaults] | |-- en.yml | |-- ja.yml |-- [users] | |-- en.yml | |-- ja.yml |-- [books] |-- en.yml |-- ja.yml
辞書ファイルの格納場所は標準では #{RAISL.ROOT}/config/locales/ の直下となっていて locales 以下のサブディレクトリの中までは読んでくれません。locales 以下のサブディレクトリの中までをすべて読むように設定します。
変更前
#{RAILS.ROOT}/config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}')]
変更後
#{RAILS.ROOT}/config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
これで準備完了です。

辞書ファイルの中身についてはその3以降でまとめていく予定です。

1 件のコメント:

  1. とても為になる記事でしたありがとうございます!!
    しかし動作確認テスト2のコードの中に%が漏れています

    返信削除